Как заставить парсера 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} "#>"