2016-03-31 3 views
1

У меня есть следующая грамматика XText, которая использует ANTLR3 под капотом. В моей грамматике я хочу поддерживать выражения, подобные TYPE(EXPRESSION) и (TYPE)(EXPRESSION). Определение типа обычно содержит другие типы (я думаю, что это проблема, но я не могу изменить это требование). Кроме того, я также хочу разрешить круглые скобки вокруг выражений.Как исправить вызов рекурсивного правила в Antlr3?

Можно ли решить рекурсию левым факторингом? Я всегда получаю следующее сообщение об ошибке.

[смертоносное] правило ruleExpression имеет не-LL (*) решение из-за рекурсивных вызовов правил, доступных из alts 1,2. Решайте левым факторингом или используйте синтаксические предикаты или используйте параметр backtrack = true.

Model: 
    e=Expression; 

Expression: 
    e=castExpression | e=parExpression | "VAR"; 

castExpression: 
    (Type | '(' Type ')') e=parExpression; 

parExpression: 
    '(' Expression ')'; 

Type: 
    "MYTYPE" t=Type | "TYPE_ID"; 
+1

@LucasTrzesniewski это XText, который использует ANTLR3 под капотом –

ответ

0

Самый простой, но необязательно из лучший способ сделать это работа положить в синтаксический предикат (=>) на всей castExpression, как это:

Expression: 
    =>e=castExpression | e=parExpression | "VAR"; 

Но, похоже, это очень сокращенная выдержка из собственно грамматики, поэтому я не могу сказать, является ли это жизнеспособным решением в полном контексте. Также обратите внимание, что включение такого длинного обзора может плохо повлиять на аспекты и производительность инструментария. И вы должны быть уверены, что понимаете последствия синтаксических предикатов, прежде чем добавлять их больше.

+0

Спасибо за ваш вклад, но можно ли описать мою грамматику без синтаксических предикатов? Я хочу иметь грамматику выражения с «операторы-литые» типа type (выражение). Основная проблема заключается в том, что я хочу разрешить скобки вокруг выражений типов _and_ (поскольку типы могут быть сложными). Я хочу разрешить выражения типа (type) (expr) или (type) ((expr) + (expr)). – user3625015

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