2017-05-08 12 views
0

현재 언어를 구문 분석하는 데 happy을 사용하고 있지만 LALR 파서 인 경우를 제외하고는 파서가 적절하지 않다고 생각합니다. 문법에서 발췌 한 내용은 다음과 같습니다.괄호와 다른 유형의 표현을 사용하여 구문 분석

ArithExpr -> ArithExpr + ArithExpr 
ArithExpr -> (ArithExpr) 
ArithExpr -> ... 

BoolExpr -> ArithExpr == ArithExpr 
BoolExpr -> (BoolExpr) 
BoolExpr -> ... 

문제는 감소 감소 충돌이 발생한다는 것입니다. 나는 다음과 같은 구문 분석 할 때 문제가 발생 생각 :

((2 + 3) == (4 + 5)) 

이 표현을 구문 분석하는 하나의 방법이있다, 그러나 문제는 내가 심지어 파서가 일부 문제가 시작하는 첫 번째 괄호에서 생각입니다. 필자가 생각하는 이유는 파서가 ArithExpr 또는 BoolExpr을 앞으로 마주 치는지 여부를 알지 못하기 때문이며, lookahead의 하나의 토큰 만 있기 때문에 잘못된 선택 일 수 있습니다.

어쨌든이 언어를 받아들이도록 문법을 다시 작성 하시겠습니까? 아니면 단지 과 BoolExpr을 하나의 유니폼 Expr처럼 구문 분석하고 형식 검사 중에 실제 형식을 처리해야합니까?

답변

1

Expr을 구문 분석하고 의미 분석 중에 형식 검사를 수행해야합니다. 그렇지 않으면 괄호로 묶인 표현식 (너무 늦을 때까지 어떤 유형인지 알 수 없음) 또는 일류 부울 값 (변수는 부울 값을 가질 수 있습니까?)을 처리하는 데 어려움을 겪습니다.

대체 방법은 my answer here을 참조하십시오 (그러나 동일한 조언을 제공합니다). 나는 그 답변에 기술 된 기술의 가치에 대해 정말로 확신하지 못하기 때문에 완결성을위한 링크를 제공하지만, 다른 LALR 파서 생성기와 본질적으로 같은 질문이라고 생각한다.