나는 theory of computation이라는 책을 읽었으며 YACC에서 구현 된 2 장의 언어 PL이 있습니다. 이 프로그램은 매우 기본입니다. 지정된 문법 규칙이 있으며 프로그램을 실행 한 후 지정된 파일에 지정된 문법의 구문이 있는지 여부를 확인합니다. 모든 규칙은 책에 나와 있으며 구현하려고합니다.YACC : 문법의 시프트/감소 충돌 찾기
그러나 구현할 때 shift/reduce 충돌 코드가 표시됩니다. 웹에서 오류를 검색 한 결과 오류가 문법 모호성을 나타냅니다. 나는 그것을 발견하려고했지만 할 수 없었다. in here 비슷한 질문이 있고 사용자가 경고를 지적했으며 일부 언어가 모호하기 때문에 무시할 수 있습니다.
문제 : 모호함이있을 경우
이- 누군가가 지적 할 수 있습니까?
다음과 같은 코드를 실행하려고하면 프로그램에서 이해하지 못합니다. 구문 오류가 발생합니다. 이것은 내가 적용한 문법 규칙에 따라 받아 들여 져야합니다. 잘못된 구문으로 문법을 전달합니까?
while X = 10; X = Y + 10; end;
내 코드 :
는%start program
%%
LETTER : 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I'
| 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R'
| 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'
;
DIGIT : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
;
name : LETTER
| name DIGIT
| name LETTER
;
numeral : DIGIT
| numeral DIGIT
;
operation : '+'
| '-'
| '*'
| '/'
| '='
| '<'
| '>'
| '>' '='
| '<' '='
;
expression : name
| numeral
| '(' '!' expression ')'
| '(' expression operation expression ')'
;
assignment : name '<' '-' expression
;
instruction : assignment
| 'g' 'o' 't' 'o' name
| 's' 't' 'o' 'p'
;
labelinstr : name ':' instruction ';'
| instruction ';'
;
loop : 'l' 'o' 'o' 'p' expression ';'
| name ':' 'l' 'o' 'o' 'p' expression ';'
;
ifthen : 'i' 'f' expression 't' 'h' 'e' 'n' ';'
| name ':' 'i' 'f' expression 't' 'h' 'e' 'n' ';'
;
while : 'w' 'h' 'i' 'l' 'e' ';'
| name ':' 'w' 'h' 'i' 'l' 'e' expression ';'
;
end : 'e' 'n' 'd' ';'
| name ':' 'e' 'n' 'd' ';'
;
program : labelinstr
| loop program end
| while program end
| ifthen program end
| ifthen program end 'e' 'l' 's' 'e' ';' program end
| program program
;
%%
#include <stdio.h>
yylex() {
int c;
while ((c=getchar()) == ' ' || c == '\n' || c == '\t') {
printf("%c",c);}
printf("%c",c);
return(c);
}
오류 메시지를 게시하십시오. 항상. – EJP
많은 문제가 있습니다. 가장 확실한 것은 입력을 토큰 화하지 않는다는 것입니다. 별도의 어휘 분석 단계 없이는 계속 진행할 수 없습니다. 이 시점에서 다른 오류를 수정하는 것은 의미가 없습니다. –
@ n.m. 나는 나중에 lex/yacc을 할 것이다. 하지만 지금은 yacc을 사용하여이 구문 분석기를 구현하기 만하면됩니다. – Neo