2017-11-07 5 views
0

나는이 질문이 많은 시간을 물어 왔다는 것을 알고있다. ANTLR을 사용하여 문법을 작성하려고합니다.ANTLR 문법 상호 왼쪽 재귀

Predicate   : LOWERCASE | Predicate VarChars ; 

VarChars   : LOWERCASE | UPPERCASE; 

fragment LOWERCASE : [a-z] ; 

fragment UPPERCASE : [A-Z] ; 

나는 다음과 같은 오류가 점점 오전하는 "규칙의 다음 세트는 상호 왼쪽 재귀된다 [술어는]"

이 고정되는 방식을 보여주세요. 내 antlr 문법에서 상호 왼쪽 재귀를 제거하는 방법.

+0

달성하려는 것은 무엇입니까? 술어는 항상 작은 글자로 시작해야한다는 귀하의 의도입니까? 유효하거나 유효하지 않은 토큰의 예를 들어 줄 수 있습니까? 오류 메시지의 기술적 인 이유는 물론 술어가 자체 규칙 대안으로 발생한다는 것입니다. – dlatikay

+0

이것은 Datalog 문법의 일부입니다. pA가 유효합니다. PA가 유효하지 않습니다. 많은 경우에 상호 왼쪽의 재귀 오류가 발생했습니다. 오류를 수정하려면 어떻게합니까? 술어를 자체 규칙 대안으로 어떻게 사용할 수 있습니까? –

+0

대문자로 시작하는 규칙은 렉서 규칙입니다. 혼란을 피하기 위해, 모든 대문자 이름을 사용하는 것이 관례입니다. 당신이 원하는 것은 :'PREDICATE : LOWERCASE (LOWERCASE | UPPERCASE) *;'. 그리고'PA '와 같은 입력을위한 또 다른 규칙을 제공해야합니다. 그렇지 않으면 토큰 인식 오류가 발생할 것입니다. – BernardK

답변

0

"술어"의 재귀 적 발생을 모두 제거하십시오. VarChars만으로도 소문자 또는 대문자를 의미하기에 충분합니다. "하나 이상의 인스턴스"를 표시하기 위해 + 접미사를 사용하여 귀하의 예에 적용

fragment LOWERCASE : [a-z]; 
fragment UPPERCASE : [A-Z]; 

VARCHARS : LOWERCASE | UPPERCASE; 
PREDICATE : LOWERCASE VARCHARS+; 

,이 "P"와 술어로 "PA"를 박탈하고, "펜실바니아"자격을 것입니다.

PREDICATEVARCHARS은 어휘가 어떻게 구성되는지를 설명 할 때 (구문 규칙과는 대조적으로) 여전히 어휘 규칙입니다. 따라서 모든 대문자 명명 규칙 (Antlr은 상관하지 않지만 가독성이 향상됩니다)을 따릅니다.