使用Parse :: RecDescent打印和连接

时间:2010-08-23 15:17:36

标签: perl parsing grammar parse-recdescent

我正在测试P::RD tutorial的语法,以便开发自己的语法。 我还没弄明白如何打印字符串声明并在其前面附加'$'。 例如,“STRING sDir”应打印出“$ sDir”。只需要执行$ string = ~s / STRING / \ $ /就可以了,但是有什么分配呢?例如。 “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的; $巴;

1 个答案:

答案 0 :(得分:2)

我不是完全关注你的问题。您只是将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


<强> 修改

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

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

我在示例中添加了:

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

打印$v