Как заставить парсера Coco / R не быть жадным - PullRequest
0 голосов
/ 09 января 2012

Мой ATG-файл определяет блок кода как

Codeblock = "<#" {anychar} "#>"

Когда сгенерированный Coco анализатор встречает такой блок:

<#
   a=5;
   print "Hello world!";
#>

Токен получает

a=5;
print "Hello

Это именно то, что я хочу.

Однако, когда он сталкивается с кодом, подобным этому:

<#
   a=5;
   print "Hello World";
#>
<#
   b=5;
   print "Foo Bar";
#>

Жетон, жадно поднимает

 a=5;
 print "Hello World";
 #>
 <#
   b=5;
   print "Foo Bar";

Как я могу сообщить Coco / R, что не делать этого?

Ответы [ 2 ]

0 голосов
/ 28 марта 2012

Ваши терминалы должны быть более явными.

«ЛЮБОЙ» вводит неоднозначность, поэтому #><# анализируется, ваш кодовый блок будет обрабатывать все, что находится между FIRST <# and LAST #>, как часть набора «ЛЮБОЙ», поскольку именно так ваша грамматика определила кодовый блок.

Возможно, попробуйте:

code = codeblock {codeblock} EOF
codeblock = "<#" {anychar} "#>"
0 голосов
/ 11 января 2012

попробуйте это:

codeblock = "<#" {anychar} "#>" .
anychar = (expression|procedure) ";" .

сделав anychar заканчивающимся на ";" тогда cocor не может по ошибке проанализировать anychar с этим шаблоном "#> <#" </p>

...