Я не полностью после вашего вопроса.Вы только определили 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
.