나는 lex와 yacc을 시험해보고 이상한 문제에 부딪 혔지 만, 문제를 자세히 설명하기 전에 내 코드를 보여주는 것이 가장 좋을 것이라고 생각합니다.Bison/Yacc 문법의 의도하지 않은 연결
%{
#include <stdio.h>
int yydebug=1;
void prompt();
void yyerror(char *);
int yylex(void);
%}
%union {
int intV;
char *strV;
}
%token INTEGER ID
%%
program: program statement EOF { prompt(); }
| program EOF { prompt(); }
| { prompt(); }
;
args: /* empty */
| args ID { printf(":%s ", $<strV>2); }
;
statement: ID args { printf("%s", $<strV>1); }
| INTEGER { printf("%d", $<intV>1); }
;
EOF: '\n'
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
void prompt() {
printf("> ");
}
int main(void) {
yyparse();
return 0;
}
아주 간단한 언어, 문자열과 정수 및 기본 REPL보다 더 구성 :
%{
#include <stdlib.h>
#include <string.h>
#include "y.tab.h"
void yyerror(char *);
%}
%%
[a-zA-Z]+ {
yylval.strV = yytext;
return ID;
}
[0-9]+ {
yylval.intV = atoi(yytext);
return INTEGER;
}
[\n] { return *yytext; }
[ \t] ;
. yyerror("invalid character");
%%
int yywrap(void) {
return 1;
}
이 내 파서 :이 내 렉서입니다. 이제 구문 분석기에서 args이 선도 콜론으로 출력된다는 것을 알 수 있습니다. 문 규칙의 첫 번째 패턴과 결합하면 REPL과의 상호 작용이 다음과 같이 나타납니다.
> aaa aa a
:aa :a aaa>
그러나, 상호 작용은 이것이다 :
> aaa aa a
:aa :a aaa aa aa
>
않는 이유는 다음과 같은 규칙의 토큰 ID
statement: ID args { printf("%s", $<strV>1); }
| INTEGER { printf("%d", $<intV>1); }
;
에는 총 입력 문자열의 의미 값이 있습니다. 개행은 포함되어 있습니까? 내가 의도 한 상호 작용을하기 위해 어떻게 내 문법을 다시 만들 수 있습니까?
고맙습니다. – troutwine