Parsing 如何修复移位以减少此语法中的冲突
下面是GOLD解析器语法的子集Parsing 如何修复移位以减少此语法中的冲突,parsing,computer-science,grammar,context-free-grammar,Parsing,Computer Science,Grammar,Context Free Grammar,下面是GOLD解析器语法的子集 <Start> ::= <Expression> <Expression> ::= <RelationalExpression> <RelationalExpression> ::= <RelationalExpression> <RelationalOp> <Factor> | <Factor> &l
<Start> ::= <Expression>
<Expression> ::= <RelationalExpression>
<RelationalExpression> ::= <RelationalExpression> <RelationalOp> <Factor>
| <Factor>
<Factor> ::= Id <FactorExtension>
| <Literal>
<FactorExtension> ::= <FactorMember> <FactorExtension>
| <FactorIndexer> <FactorExtension>
| <GenericIndexer> <FactorExtension> // Here is the problem!
|
<FactorMember> ::= '.' Id
<FactorIndexer> ::= '[' <Expression> ']'
<GenericIndexer> ::= '<' <TypeName> '>'
<TypeName> ::= <Id>
<Literal> ::= DecLiteral | HexLiteral | FloatLiteral | RealLiteral | StringLiteral
<RelationalOp> ::= '=' | '<>' | '>' | '>=' | '<' | '<='
<Id> ::= <Id> '.' Id
| Id
:=
::=
::=
|
:=Id
|
::=
|
|//问题出在这里!
|
:='.'Id
::= '[' ']'
::= ''
::=
::=DecLiteral | HexLiteral | FloatLiteral | RealLiteral | StringLiteral
:::='='''''.'>''.'>='.'''.'基本上,这种语言很难用LR(1)语法来表达
这并非不可能,但生成的语法不会生成您想要的解析树,因此您需要对AST进行后期处理。而且,写所有的作品真的很痛苦,所以修改语法会很困难
不幸的是,据我所知,GOLD parser并没有为您提供另一个选项。然而,bison
允许您生成一个GLR解析器,它在解析语言时不会有任何问题,因为它是明确的,并且作为一个额外的功能,您可以以方便易读的格式编写语法。这就是我推荐的解决方案
根据以下观察,这里有一个替代方案,显然被一些Java和/或C#解析器(但不是官方的)使用:
- 通过检查下一个标记,总是可以判断
是泛型括号的结尾还是关系运算符的结尾。在语法中,
右括号只能后跟
、[
或输入结束;这些标记都不能跟在关系运算符后面
因此,当您看到可能符合条件的
>
是两个闭合的选择括号还是一个运算符。但是,您仍然可以根据以下标记进行确定;如果外部的
是泛型选择括号,则内部的也必须是
(
(参数列表)C++也可以通过实际知道潜在模板函数名是否是模板名来解决这个问题,这实际上通常解决了通用括号识别问题,因为C++不允许你在没有完整模板参数列表的情况下接受模板化函数的地址。因此,在C++中,你非常感谢你的长而完整的答案。你给了我很好的见解和建议。我打算研究野牛,看看它是否适合我的需要。我还有其他的选择,比如AntLR和LLVM。所有这些都是我现在必须考虑的可能性,因为我确信事情不会进化。沿着这条路走!
Instance.Member < 50
Intance.Member<Integer> < 50