2014-02-19 4 views
2

상호 왼쪽 재귀에 대해 다른 질문을하는 것은 유감 스럽다. 내 상황이 내 상황과 다르거 나 다른 사람의 문법과 관련이 있다고 생각할 수 없다. 나는 comp SCI 세계에 약간 새로운데 (나는 영어로 자기 자신을 가르친다. 이것은 나의 목표 언어이며, 현재는 ANTLR4이다.) 가능하다면, CS 주요 용어가 아닌 평신도 용어로 설명하라.상호 왼쪽 재귀 ANTLR 4

대수학 및 기호 파생물이 필요한 프로그램을 작성하고 있으며 물론 구문 분석이 필요하며 나무가 작동해야하지만 ANTLR4가 직접 지원한다고 생각하여 걱정하지는 않습니다. 왼쪽 재귀,하지만 분명히 그것은 어떻게 든하지 않습니다. 결과물에서, [식]이 서로 반복적으로 남아 있고 분명히 허용되지 않는다는 것을 계속 말하고 있습니다 ...? 내 질문 :

1) 누군가가 왼쪽 재귀/상호 왼쪽 직접 재귀가있을 경우 차이점을 설명 할 수 있습니까?

2) 내 문법에서이 재귀 성가심을 일으키는 원인과 해결 방법을 설명 하시겠습니까? 그리고 이것이 주제가 맞는지 확실하지 않습니다.

3) 사람들은 대안과 라벨링 대안에 대해 말합니다. (나는 그들이 #label 표기법을 의미한다고 생각합니다.) 저건 뭘위한거야?

grammar MathProcessor; 
@header {package utils;} 
END: ';'; 
EQUALS: '='; 
SIN: 'sin('; 
COS: 'cos('; 
TAN: 'tan('; 
SEC: 'sec('; 
CSC: 'csc('; 
COT: 'cot('; 
LN: 'ln('; 
EPOW: 'pow('; 
RPAREN: '('; 
LPAREN: ')'; 
EXP: '^'; 
MULT: '*'; 
DIV: '/'; 
ADD: '+'; 
SUBT: '-'; 
VAR: ('a'..'z'|'A'..'Z'); 
INT: ('0'..'9')+; 
mathobj: ((equation|expression) END) EOF; 
equation: (expression '=' expression); 

expression: 
((RPAREN|SIN|COS|TAN|SEC|CSC|COT|LN|EPOW) expression (RPAREN)) #parenOps 
| (expression EXP expression) #exponent 
| (expression (MULT|DIV) expression) #multiplyDivide 
| (expression (ADD|SUBT) expression) #addSubtract 
| (VAR|INT) #varInt 
; 

답변

5

문법에서 불필요한 괄호의 여러 사례를 단순히 제거하면 문법이 실제로 ANTLR 4에서 작동합니다. 왼쪽 재귀 제거 알고리즘은 다음의 예에서 나타나는 바로 왼쪽 재귀 작동 :

a 
    : B 
    | a B // the reference to 'a' here is direct left recursion 
    ; 

재귀 차 다른 형태는 일반적으로 두 개의 규칙을 사용하여 설명된다 간접 왼쪽 재귀이다. 문법의 경우

a 
    : B 
    | c 
    ; 

c 
    : a B // the reference back to 'a' is indirect left recursion 
    ; 

는 ANTLR은 익명의 하위 규칙으로 (...) 치료, 그래서 다음과 같은 코드는 간접 왼쪽 재귀로 결정된다. 예제에서 괄호를 제거하면 첫 번째 경우처럼 동작합니다.
a 
    : B 
    | (a B) 
    ; 

이 당신의 마지막 질문에 대답하기 위해, #label 구문은 그 대안을 생성 파스 트리 클래스를 변경합니다. 예를 들어 일반 ExpressionContext 개체를 생성하는 대신 3이라는 표현식은 VarIntContext을 생성합니다. 이를 통해 자동 생성 된 리스너와 방문자의 규칙에서 여러 대안을 구별 할 수 있습니다.

+0

정말 고마워요! 마침내 ANTLRworks에서 구문 트리를 멋지게 보이게하기 위해 약간의 조정 작업을 마쳤습니다! 사용 방법을 알아낼 수 있는지 또는 작동 순서를 유지할지 여부는 알 수 있습니다. 그러나 나중에 설명해 드리겠습니다. – user3326093