【问题标题】:Printing and concatenation with Parse::RecDescent使用 Parse::RecDescent 打印和连接
【发布时间】:2010-08-23 15:17:35
【问题描述】:

我正在测试P::RD tutorial 的语法,以便开发自己的语法。 我还没有弄清楚如何打印字符串声明并将“$”附加到它的前面。 例如“STRING sDir”应该打印出“$sDir”。只需执行 $string =~ s/STRING /\$/ 就足够简单了,但是有赋值的情况呢?例如。 “字符串 sDir = aNewDir”。

这里是语法

OP       : m([-+*/%])      # Mathematical operators
INTEGER  : /[-+]?\d+/      # Signed integers
VARIABLE : /\w[a-z0-9_]*/i # Variable
STRING   : /STRING/i       # String declaration

expression : INTEGER OP expression
          { return main::expression(@item) }
          | VARIABLE OP expression
          { return main::expression(@item) }
          | INTEGER
          | VARIABLE
          { return $main::VARIABLE{$item{VARIABLE}} }

我开始认为正则表达式就足够了,但想知道如何为逗号分隔的声明创建一个复杂的表达式,例如 "STRING, foo, bar" -> $foo; $酒吧;

【问题讨论】:

    标签: perl parsing grammar parse-recdescent


    【解决方案1】:

    我没有完全关注你的问题。您只将STRING 定义为一个标记,您还没有给它任何语义操作。下面的规则——出现在教程中——告诉我们如何处理令牌。

    print_instruction : /print/i expression
                      { print $item{expression}."\n" }
    assign_instruction : VARIABLE "=" expression
                       { $main::VARIABLE{$item{VARIABLE}} = $item{expression} }
    
    instruction : print_instruction
                | assign_instruction
    
    startrule: instruction(s /;/)
    
    • 底部规则说我们正在寻找一个或多个指令,用分号分隔。
    • instruction 规则说指令要么是赋值要么是打印指令。
    • 打印指令采用单词printexpression 并打印表达式的结果。
    • 赋值指令接受一个变量、文字'=' 和一个表达式,并将表达式的结果分配给%main::VARIABLE 散列中的名称。
    • expression 有两种操作,一种用于调用&main::expression 的复合表达式,另一种用于从%main::VARIABLE 哈希中检索命名值的变量。

    您刚刚创建了一个令牌类型,但没有规则依赖于该令牌。此外,我对您想要做的事情有了大致的了解,但还不足以指导我为您想要做的事情创建语义动作。

    不知道你到底想把指令放在哪里,我只是在expression 中添加了以下案例:

             | 'STRING' /[\p{Alpha}_]\w*/
             { return '$' . $item[2] }
    

    这意味着它会查找确切的字符串'STRING',后跟标识符序列。所以你可以像这样使用它:

    print STRING vvv
    

    然后得到$vvv


    编辑

    如果我正确理解您的评论,我在instruction 中添加了string_instruction 规则并将其定义为:

    string_instruction : 'STRING' /[\p{Alpha}_]\w*/
                       { print "\$$item[2]"; }
    

    我在示例中添加了:

    print "STRING v\n";  $parser->startrule( "STRING v" );
    

    打印$v

    【讨论】:

    • 我已经了解引擎的工作原理。我的问题是:就像 print_instruction 在操作中使用 print 命令打印表达式一样,如何打印前面带有“$”的 STRING 表达式?
    • 很好用。实际上我不久前尝试过类似的东西,但也许我没有在规则中调用子规则。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多