2016-10-06 2 views
0

Я пытаюсь написать грамматику, которая позволяет мне написать любое выражение в выражении if.antlr4 grammar non greedy

Мои, если заявление будет что-то вроде ниже: , если [х == 1] [делать некоторые вещи]

Выражение должно быть любое выражение Python.

Если я использую не-жадное соответствие, как показано ниже, как я могу указать '[' или ']' как часть выражения? Понимание списка будет проблемой с моей грамматикой.

ifval 
    : (SPACE)* IF (SPACE|WORD)* SQRLBRACE .*? SQRRBRACE (WORD|SPACE)* <blah> <blah>; 

WORD  : ('a'..'z' | 'A'..'Z'| '_' | '-')+; 
NUM  : [0-9]; 
NEWLINE : '\r'? '\n' | '\r'; 
SPACE : (' ' | '\t') ; 
SQRRBRACE: ']'; 
SQRLBRACE: '['; 
+0

Не понимаю. Кажется, вы ориентируетесь на Python, но если на этом языке не используются квадратные скобки. –

+0

Я пишу небольшой язык, который позволяет мне писать какие-то английские заявления и преобразовывать «английский как» в Python. Чтобы оценить выражения, мне пришлось добавить инструкцию if к языку. В утверждении if я надеялся поддержать любое питоновское выражение. Надеюсь, у меня есть смысл – kgunjikar

ответ

1

Обобщенных использовать типичную формулировку утверждения:

stmt : ifval 
     | .... 
     ; 

ifval : IF expr body ; 

expr : LBRACK expr? RBRACK 
     | NOT expr 
     | WORD (LBRACK WORD? RBRACK)? // value or array[idx] 
     | .... 
     ; 

body : WORD 
     | LBRACE stmt* RBRACE 
     | .... 
     ; 

expr правила будет обрабатывать возникновение дополнительных и вложенных скобок через рекурсию.

BTW, почти всегда лучше скрывать пробелы в грамматике, даже для языков Python/whitespace sensitive. Скрываясь, WS остается легко доступным для вычисления уровня отступов. И грамматика не загрязняется тогда, когда нужно указывать все возможные места SPACE *.

Смежные вопросы