Parsing 如何修复移位以减少此语法中的冲突

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

下面是GOLD解析器语法的子集

<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#解析器(但不是官方的)使用:

  • 通过检查下一个标记,总是可以判断
    是泛型括号的结尾还是关系运算符的结尾。在语法中,
    右括号只能后跟
    [
    或输入结束;这些标记都不能跟在关系运算符后面

因此,当您看到可能符合条件的
>
是两个闭合的选择括号还是一个运算符。但是,您仍然可以根据以下标记进行确定;如果外部的
是泛型选择括号,则内部的也必须是

> P> C++(不像java或C++)允许非类型模板参数,所以它实际上是合法的,对于代码< >b>代码>是(布尔)模板参数。C++坚持“<代码> >代码>是通过括号化表达式来保护的,如果你要沿着该路径走下去,这可能是个好主意。


  • 泛型函数会产生一个特殊的问题,因为它们后面可以跟一个
    (参数列表)C++也可以通过实际知道潜在模板函数名是否是模板名来解决这个问题,这实际上通常解决了通用括号识别问题,因为C++不允许你在没有完整模板参数列表的情况下接受模板化函数的地址。因此,在C++中,你非常感谢你的长而完整的答案。你给了我很好的见解和建议。我打算研究野牛,看看它是否适合我的需要。我还有其他的选择,比如AntLR和LLVM。所有这些都是我现在必须考虑的可能性,因为我确信事情不会进化。沿着这条路走!
    Instance.Member < 50
    
    Intance.Member<Integer> < 50