Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GPPG(野牛)-如何实施;“表达式”;概念_C#_Bison_Lalr_Gppg - Fatal编程技术网

C# GPPG(野牛)-如何实施;“表达式”;概念

C# GPPG(野牛)-如何实施;“表达式”;概念,c#,bison,lalr,gppg,C#,Bison,Lalr,Gppg,我们使用GPPG(基本上是C#的bison)为编程语言生成解析器。一切都很顺利,只是有一点很糟糕。我们正在解析的语言有一种“隐式比较”规则,“表达式”应该解释为“表达式==表达式” 例如,这是一个完全有效的语句: If SomeValue False Then EndIf 这显然会在解析器生成过程中引入各种冲突。我第一次尝试解决这些问题时遵循了以下思路(为简洁起见进行了编辑)。我试着对规则进行重构,它似乎不再模棱两可了,但我肯定是遗漏了一些明显的东西 这是一个非常小的语法,它显示了我所遇到

我们使用GPPG(基本上是C#的bison)为编程语言生成解析器。一切都很顺利,只是有一点很糟糕。我们正在解析的语言有一种“隐式比较”规则,“表达式”应该解释为“表达式==表达式”

例如,这是一个完全有效的语句:

 If SomeValue False Then
 EndIf
这显然会在解析器生成过程中引入各种冲突。我第一次尝试解决这些问题时遵循了以下思路(为简洁起见进行了编辑)。我试着对规则进行重构,它似乎不再模棱两可了,但我肯定是遗漏了一些明显的东西

这是一个非常小的语法,它显示了我所遇到的冲突,以及我如何试图解决它,但并不奏效

%start program
%token <Token> Plus
%token <Token> Times
%token <Constant> Constant

%left Plus
%left Times
%left IMPLICIT_COMPARISON

%%

program: expression;

expressionBase: Constant
    | expression Plus expression
    | expression Times expression;

expression: expressionBase
    | expression expressionBase %prec IMPLICIT_COMPARISON;

%%
%启动程序
%代币加号
%象征时间
%标记常数
%左加
%离开时间
%左隐式比较
%%
节目:表达;
expressionBase:常量
|表达式加表达式
|表达次数表达;
表达式:expressionBase
|表达式expressionBase%prec隐式\u比较;
%%
非常感谢您的帮助

这个怎么样:

program: expression;

expressionBase: Constant
    | expressionBase Plus expressionBase
    | expressionBase Times expressionBase;

expression: expressionBase 
    | expressionBase expression;
您需要自下而上构建语法,而不是将低级概念(如
expressionBase
)与高级概念(如
expression
)混为一谈。高级的是与低级的一起构建的。如果您需要另一种方式,您必须用括号或类似的方式清楚地界定高层概念,如下所示:

expressionBase: Constant
    | expressionBase Plus expressionBase
    | expressionBase Times expressionBase
    | LeftParen expression RightParen;

实际规则相当复杂,但这应该让您开始。

除了解决方案中的优先级错误之外(不确定在我的示例中是否错误,未检查,sry)。某些二元运算符绑定比隐式比较低。例如,23==True可以解释为(2==3)=True,而不是2==(3==True)hm。。。如果我分三个层次来做的话,我可能真的可以让它这样工作。。。等一下,我要试着说声谢谢,伙计,一切都好了。只需将内容分为三个级别:高绑定二进制运算符、隐式比较,然后是低绑定二进制运算符。。。谢谢,只是需要好好考虑一下:)好吧,这个例子没有定义任何显式==运算符,所以我不确定它怎么会有任何类型的优先级。如果希望==绑定弱于隐式比较,则可以创建另一个专用级别,或者使用%prec声明。如果希望它绑定得更强,只需将其以适当的优先级添加到expressionBase规则中即可。