1

我正在测试P::RD 教程中的语法,以便开发自己的语法。我还没有弄清楚如何打印字符串声明并将“$”附加到它的前面。例如“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; $酒吧;

4

1 回答 1

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赋值要么是打印指令。
  • 打印指令接受单词print和 anexpression并打印表达式的结果。
  • 赋值指令接受一个变量、literal'='和一个表达式,并将表达式的结果分配给%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

于 2010-08-23T17:20:50.487 回答