2012-07-15 4 views
0

레몬을 사용하여이 간단한 파서를 컴파일하려고 할 때 충돌이 발생하지만 어떤 규칙이 잘못된 것인지 알 수 없습니다. binaryexpression이나 callexpression을 제거하면 충돌이 사라집니다.표현식 호출과의 시프트/줄이기

%left Add. 

program ::= expression. 

expression ::= binaryexpression. 
expression ::= callexpression. 

binaryexpression ::= expression Add expression. 

callexpression ::= expression arguments. 

arguments ::= LParenthesis argumentlist RParenthesis. 
arguments ::= LParenthesis RParenthesis. 

argumentlist ::= expression argumentlist. 
argumentlist ::= expression. 

[편집]는 LParenthesis에 좌측 연관성 충돌을 해결했다 첨가. 그러나 그것이 올바른지 알고 싶습니다. 몇 가지 문법 (fe C++)이 건설 연산자 '()'와 호출 연산자 '()'에 대해 우선 순위가 다른 것을 보았습니다. . 그래서 옳은 일에 대해 확신하지 못합니다.

+0

문법이 완성 되었습니까? 왜냐하면 지금은 빈 언어를 정의하기 때문입니다. – MvG

답변

0

문제는 문법이 모호하다는 것입니다. 입력 순서를 모두 보지 않고 binaryexpression 또는 callexpression으로 줄이는 것을 결정할 수는 없습니다. 모호성은 expression을 통한 왼쪽 재귀 때문에 발생합니다. expression은 터미널을 파생 할 수 없으므로 종료 할 수 없습니다.