【问题标题】:Creating Bison File for Simple Grammar为简单语法创建 Bison 文件
【发布时间】:2013-03-03 01:20:17
【问题描述】:

我有以下简单语法:

E -> T | ^ v . E 
T -> F T1 
T1 -> F T1 | epsilon
F -> ( E ) | v

我对 Bison 很陌生,所以我希望有人能帮助我教我如何以这种格式写出来。到目前为止,我只有以下内容,但我不确定它是否正确:

 %left '.'
 %left 'v'
 %% /* The grammar follows.  */

 exp:
 term               {printf("1");}
 | '^' 'v' '.' exp  {printf("2");}
 ;

 term:
 factor term1       {printf("3");}
 ;

 term1:
 factor term1       {printf("4");}
 |                  {printf("5");}      
 ;

 factor:
 '(' exp ')'        {printf("6");}
 | 'v'              {printf("7");}
 ;
 %%

【问题讨论】:

    标签: parsing compiler-construction grammar bison yacc


    【解决方案1】:

    您缺少几个产生式的结束分号。源语法中没有任何内容表明您需要有关行的产生式。

    【讨论】:

    • 您对分号是正确的,但我认为 Bison 在编译期间为我解决了这个问题 - .output 文件在之前和之后是相同的。不过,关于线条的好点。其他一切都匹配吗?
    • 谢谢。我想知道您是否还可以告诉我是否生成 .output 文件,是否将 %left 规则放在首位。
    • 它们很重要,但源语法中没有任何内容可以告诉您它们是否是左关联的。另一方面,除幂运算之外的大多数运算符都是左结合的,所以这是一个很好的猜测。但是对于课程作业,我会将它们排除在外,除非这样做会引入歧义,野牛会告诉你。他们是用于解除引用和记录成员资格的 Pascal 运算符吗?
    • 我没有在问题中指定它,但这是 lambda 演算的语法,其中一个要求是 'v' 是左关联的,并且它比 '.' 绑定得更紧密。老实说,我对“绑定比”这个术语有点困惑,但我认为这意味着它具有更高的优先级。
    • 在这种情况下,源语法是错误的,因为它赋予它们相同的优先级。先整理一下。不要将关联性与优先级混淆。
    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多