【问题标题】:Is it possible to stack Yacc grammar rule code?是否可以堆叠 Yacc 语法规则代码?
【发布时间】:2009-11-20 00:55:50
【问题描述】:

假设我每次匹配规则时都需要运行一些初始化代码,如何减少冗余?

rule : TOKEN1 { init(); token1Code(); }
     | TOKEN2 { init(); token2Code(); }
     ;

也可以做类似的事情

rule : TOKEN1
     | TOKEN2
     { codeForToken1OrToken2(); }
     ;

【问题讨论】:

    标签: c++ c parsing yacc bison


    【解决方案1】:

    你可以使用类似的东西:

    rule : { init(); } real_rule { codeForToken1or2(); } ;
    
    real_rule : TOKEN1 { token1Code(); }
              | TOKEN2 { token2Code(); }
              ;
    

    但这可能会引入冲突,具体取决于“规则”的使用方式。

    【讨论】:

    • 这个语法和 DevDevDev 贴的不一样
    • 您发布的原始语法不是同一种语言。现在,您已经纠正了错误
    • 顺便说一句,语法不接受语言。它的作用是生成一种语言。只有自动机接受语言。
    【解决方案2】:

    因为这真的有效:

    rule : TOKEN1 { getToken(); init(); token1Code(); }
         | TOKEN2 { getToken(); init(); token2Code(); }
         ;
    

    其中 getToken(); 是与输入中的下一个标记匹配的函数的名称(我不记得函数的名称),你可以调用一些 init(); 在里面。

    【讨论】:

    • 你似乎没有回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多