Как я могу улучшить свою грамматику парсера, чтобы вместо создания AST, содержащего пару правил decFunc
для моего тестового кода. Он создаст только один, а sum
станет вторым корнем. Я попытался решить эту проблему несколькими разными способами, но всегда получаю левую рекурсивную ошибку. Это мой код тестирования:ANTLR 4 Parser Grammar
f :: [Int] -> [Int] -> [Int]
f x y = zipWith (sum) x y
sum :: [Int] -> [Int]
sum a = foldr(+) a
Это моя грамматика: Это изображение, которое имеет в этой связи два decFunc
http://postimg.org/image/w5goph9b7/
prog : stat+;
stat : decFunc | impFunc ;
decFunc : ID '::' formalType (ARROW formalType)* NL impFunc
;
anotherFunc : ID+;
formalType : 'Int' | '[' formalType ']' ;
impFunc : ID+ '=' hr NL
;
hr : 'map' '(' ID* ')' ID*
| 'zipWith' '(' ('*' |'/' |'+' |'-') ')' ID+ | 'zipWith' '(' anotherFunc ')' ID+
| 'foldr' '(' ('*' |'/' |'+' |'-') ')' ID+
| hr op=('*'| '/' | '.&.' | 'xor') hr | DIGIT
| 'shiftL' hr hr | 'shiftR' hr hr
| hr op=('+'| '-') hr | DIGIT
| '(' hr ')'
| ID '(' ID* ')'
| ID
;
Какой желаемый выход? Не имеет смысла говорить «создание одного вместо двух« decFunc ». Попробуйте создать AST так же, как вы хотите. – Mephy
@Mephy Я улучшил свой вопрос. Я в основном пытаюсь сделать сумму ссылкой на другой стат, который может быть декларацией или реализацией. Однако сумма - это только первое слово декларации или реализации. Как я могу это сделать? это то, о чем я прошу. Некоторые предлагают посмотреть. Но я не знаю, как это сделать. –
Все еще неясно, что вы просите. Ваш тестовый ввод содержит два экземпляра контента, которые будут соответствовать правилу 'decFunc'.Сгенерированное ** дерево синтаксического анализа ** точно показывает: два поддерева, каждый из которых имеет экземпляр 'deFunc' в качестве корня. Antlr v4 не будет создавать истинный АСТ, где 'f' и' sum' являются корнями отдельных поддеревьев, если это то, что вы ищете. – GRosenberg