YACC/Bison中token同时匹配多条产生式的执行逻辑咨询
Bison多产生式匹配规则问题解答
核心结论
你的判断完全符合你给出的规则场景,无额外关联产生式的前提下,输入STARTED FLOAT_NUM时仅会触发title对应的规则动作,my_type规则仅在输入为单独FLOAT_NUM token时触发。
原理说明
YACC/Bison是基于LALR(1)的自底向上语法分析器,执行逻辑是根据栈内已有的符号序列 + 向前预读1个token,决定执行「移进token入栈」或者「把栈顶匹配某产生式右部的符号替换为左部非终结符(同时触发对应动作)」的操作。
针对你给出的规则:
title: STARTED FLOAT_NUM my_type: FLOAT_NUM
以及顶层文法允许匹配title和my_type的前提:
- 输入
STARTED FLOAT_NUM时,分析流程为:- 先移进
STARTED入栈 - 再移进下一个token
FLOAT_NUM入栈 - 预读到输入结束标记后,栈顶的
STARTED FLOAT_NUM完整匹配title的产生式右部,直接执行title的规约动作,不会单独对FLOAT_NUM做my_type的规约
- 先移进
- 只有输入仅为单个
FLOAT_NUM时,栈顶只有FLOAT_NUM,才会匹配my_type的产生式触发对应动作。
特殊例外
如果你的文法中存在其他关联规则,比如title: STARTED my_type,那此时FLOAT_NUM会先被规约为my_type触发对应动作,再和STARTED一起规约为title触发title的动作,不过这种情况和你给出的规则示例无关。
内容的提问来源于stack exchange,提问作者volnistii11
相关产品推荐
相关产品推荐

