野牛:如何解决Varname& Varname减少/减少问题?

时间:2010-11-27 02:29:21

标签: bison

假设您正在编写类似C ++的语言,并允许引用

int& i

您还允许按位和

7&5

您如何解决减少/减少冲突?我不是说使用glr-parser但根本没有冲突。示例语法问题是

var&var //could be type& var or logical val & val

2 个答案:

答案 0 :(得分:2)

您区分语法术语的顺序:

<type> & <identifier>

<identifier> & <identifier>

虽然在后一种情况下,你可能真的在处理:

<expression> & <expression>

或一些类似的构造,其中'<expression>'最终为文字整数或简单变量名。

这可能需要对词法分析器进行语义反馈 - 它需要能够识别int(在示例中)是类型名称(关键词)而不是通用标识符,但它还需要被告知typedef名称,以便它们也可以被视为类型。但请记住,通常,typedef名称是作用域的。

答案 1 :(得分:0)

你可以告诉flex为文字&返回一个不同的标记,具体取决于之前的“lexed”。所以你最终得到两条规则:

<type> T_AMPERSAND <identifier>

<expression> T_LOGIC_AND <expression>

如果您的新语言支持用户定义的类型,则词法分析器将不知道它是否刚刚找到<type><identifier>。在这种情况下,您可能希望确保<type> '&' <identifier>被视为有效的独立语句,而<expression> '&' <expression>只能显示为右值(在作业的右侧)。