2012-01-09 2 views
0

Мой ATG файл определяет блок кода, какКак получить Coco/R парсер не жадничать

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 не знаю, чтобы сделать это?

ответ

0

попробовать это:

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

путем anychar закончилась ";" то кокон не может ошибочно разобрать anychar с этим рисунком "#> < #"

+0

У меня уже есть anychar определяется как 'anychar = ANY.' так, что включает в себя запятой. Кроме того, поскольку точка с запятой используется как конечная, я не могу исключить ее из anychar. – xbonez

+0

'ЛЮБОЙ' слишком много. используйте '' qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM ". – coffeeground

+0

'anychar = (выражение | процедура)"; " EOL. 'Где EOL = CHR (10).' в разделе ХАРАКТЕРЫ – coffeeground

0

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

«ANY» вводит неоднозначность, которая почему #><# в настоящее время анализируется, ваш кодоблок будет относиться ко всему, между первым <# and LAST #> как часть набора «ANY», так что, как ваша грамматика определяется кодоблок.

Возможно попробовать:

code = codeblock {codeblock} EOF 
codeblock = "<#" {anychar} "#>"