我正在测试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的; $巴;
答案 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
规则表示指令是赋值或打印指令。 print
和expression
并打印表达式的结果。 '='
和表达式,并将表达式的结果分配给%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
。