Как заставить парсера Coco/R не быть жадным

Мой файл 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 ответа

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

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

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

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

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

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

code = codeblock {codeblock} EOF
codeblock = "<#" {anychar} "#>"
Другие вопросы по тегам