Печать и объединение с Parse :: RecDescent - PullRequest
1 голос
/ 23 августа 2010

Я тестирую грамматику из 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 Ответ

2 голосов
/ 23 августа 2010

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

...