2011-04-23 13 views
1

이있는 Fsyacc의 예제 문법 확장 "F # Parsed Language Starter"의 일부로 제공되는 예제 문법을 확장하여 단항 마이너스 (2 * -5와 같은 표현식)를 지원하려고했습니다. 다음과 같이 문법의 규칙단항 마이너스

...... 
%nonassoc UMINUS 
.... 

과 :

나는 나는과 같이 우선 순위를 포함하도록 .fsy 파일의 헤더를 확장, here

기본적으로 Samsdram 같은 블록에 충돌

또한
... 
Expr: 
| MINUS Expr %prec UMINUS { Negative ($2) } 
... 

의 AST의 정의 :

... 
and Expr = 
    | Negative of Expr 
..... 

위의 식을 구문 분석 할 때 여전히 구문 분석 오류가 발생합니다.

아이디어가 누락되었습니다. 나는 F # 컴파일러의 소스 코드를 읽고는 매우 유사한 것으로 보인다 그들이이 문제를 해결하는 방법을 명확하지 않다

우선 순위를 가지고 이런 식으로 정렬

편집 :

%left ASSIGN 
%left AND OR 
%left EQ NOTEQ LT LTE GTE GT 
%left PLUS MINUS 
%left ASTER SLASH 
%nonassoc UMINUS 
+0

우선 순위를 모두 정할 수 있습니까? –

+0

편집 된 질문 우선 순위 순서 –

답변

0

주위에 연극을했다 및 %prec을 필요로하지 않고 우선 순위를 유지할 수있었습니다. 스타터 조금하지만 (더 의미있는 이름) 내가 스타터를 수행하는 방식을 좋아하지 않았다으로

Prog: 
    | Expression EOF { $1 } 

Expression: 
    | Additive { $1 } 

Additive: 
    | Multiplicative { $1 } 
    | Additive PLUS Multiplicative { Plus($1, $3) } 
    | Additive MINUS Multiplicative { Minus($1, $3) } 

Multiplicative: 
    | Unary { $1 } 
    | Multiplicative ASTER Unary { Times($1, $3) } 
    | Multiplicative SLASH Unary { Divide($1, $3) } 

Unary: 
    | Value { $1 } 
    | MINUS Value { Negative($2) } 

Value: 
    | FLOAT { Value(Float($1)) } 
    | INT32 { Value(Integer($1)) } 
    | LPAREN Expression RPAREN { $2 } 

가 나는 또한, 하나의 변형으로 표현을 그룹화를 수정. (그것을 걷는 것은 어색했다).

type Value = 
    | Float of Double 
    | Integer of Int32 
    | Expression of Expression 

and Expression = 
    | Value of Value 
    | Negative of Expression 
    | Times of Expression * Expression 
    | Divide of Expression * Expression 
    | Plus of Expression * Expression 
    | Minus of Expression * Expression 

and Equation = 
    | Equation of Expression 
+0

그래, 나는 문법을 바꾸고 싶지 않았다. 내 문법은 그보다 훨씬 큽니다 ... Harrop의 제안을 먼저 시도해보십시오. 그렇지 않으면 문법이 변경 될 것입니다. 많은 감사합니다! –

0

내 기사 Parsing text with Lex and Yacc (2007 년 10 월)에서 코드를 가져 오십시오.

내 우선 순위를 가지고 있기는 다음과 같다 :

%left PLUS MINUS 
%left TIMES DIVIDE 
%nonassoc prec_uminus 
%right POWER 
%nonassoc FACTORIAL 

와 yacc를 구문 분석 코드는 다음과 같습니다

expr: 
| NUM       { Num(float_of_string $1) } 
| MINUS expr %prec prec_uminus { Neg $2 } 
| expr FACTORIAL    { Factorial $1 } 
| expr PLUS expr    { Add($1, $3) } 
| expr MINUS expr    { Sub($1, $3) } 
| expr TIMES expr    { Mul($1, $3) } 
| expr DIVIDE expr    { Div($1, $3) } 
| expr POWER expr    { Pow($1, $3) } 
| OPEN expr CLOSE    { $2 } 
; 

동등한 보인다. 제 생각에는 대신에 UMINUS을 대문자로 사용하는 것이 문제라고 생각하지 않습니까?

다른 옵션은 expr을 각 우선 순위 수준마다 하나씩 여러 개의 상호 순환 부분으로 나누는 것입니다.

+0

당신의 변화를 시도 할 것이지만 솔직히 그것이 도움이 될 방법을 보지 마라. 당신은 fsyacc가 완전히 yo yacc와 동등하다고 가정하고 있는가? 그것이 작동하지 않는다면 Mark H.에 의해 제안 된 것처럼 문법을 변경해야합니다 (정말로 원하지 않았습니다). 고마워요! –

+0

아니요, 실제로 fsyacc에 대해 이야기하고 있습니다. 이 코드는 내가 작성했을 때 fsyacc에서 작동했습니다. 네가 왜 똑같이 보이는지 모르겠다. 문제가 무엇인지 알아 내면 알려주세요! –

관련 문제