Печать и объединение с Parse::RecDescent
Я тестирую грамматику из учебника P::RD, чтобы разработать свою собственную грамматику. Я не понял, как напечатать декларацию строки и добавить к ней "$". Например, "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 ответ
Я не совсем понимаю ваш вопрос. Вы только определили 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
,