假设您正在编写类似C ++的语言,并允许引用
int& i
您还允许按位和
7&5
您如何解决减少/减少冲突?我不是说使用glr-parser但根本没有冲突。示例语法问题是
var&var //could be type& var or logical val & val
答案 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>
只能显示为右值(在作业的右侧)。