我有语法等

%(var)

%var

和     (VAR)

我的规则是类似

optExpr:
    | '%''('CommaLoop')'
    | '%' CommaLoop

CommaLoop:
    val | CommaLoop',' val

Expr:
    MoreRules
    | '(' val ')'

问题是,它似乎没有能够分辨)属于%(CommaLoop)% (val)但抱怨的),而不是(什么鬼?不应该是抱怨上(?我应该如何修正这个错误?我觉得做%(令牌是一个很好的解决方案,但我想知道为什么$(在此之前心不是一个错误。

有帮助吗?

解决方案

这是由于这样的方式LR分析作品。 LR分析实际上是自下而上的,组合在一起令牌根据你的语法规则的RHS,并与LHS替换它们。当分析器“转移”,它把堆栈上的道理,但实际上并不匹配规则呢。相反,它跟踪部分通过当前状态相匹配的规则。当它到达对应于规则的端部的状态下,它可以减少,弹出用于RHS符号从堆栈和推回单个符号表示的LHS。因此,如果有冲突,他们不露面,直到解析器到达某种规则的结尾并不能决定是否减少(或者什么来减少)。

在你的榜样,在看到 VAL 后,即会在堆栈上什么(顶部是在右侧点击这里)当先行是,它不能决定它是否应该通过规则弹出VAL和减少的 CommaLoop:VAL 的,或如果应改变的因此它可以然后弹出3个事物和与规则减少的 Expr的: '(' VAL ')'

我这里假设你有一些额外的规则,比如 CommaLoop:Expr的的,否则你的语法实际上并不匹配任何和野牛/ yacc的会抱怨未使用的非终端

其他提示

现在,你的解释,你的语法似乎并不匹配。在你的解释,你看这三个短语有“无功”,但你的语法显示了那些以“%”开始为允许逗号分隔的列表,而一个没有只允许一个单一的“VAL”。

有关的那一刻,我会承担所有三个应该允许一个逗号分隔的列表。在这种情况下,我会因素语法更是这样的:

optExpr: '%' aList

aList: CommaLoop
    | parenList

parenList: '(' CommaLoop ')'

CommaLoop: 
    | val 
    | CommaLoop ',' val

Expr: MoreRules
    | parenList

我已经改变了optExpr和Expr的也不存在这样匹配空序列 - 我的猜测是,你可能不打算说下手。我已经充实了这一点,足以通过byacc运行它;它不产生警告或错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top