Я экспериментирую с lex и yacc и столкнулся с странной проблемой, но я думаю, что лучше всего показать вам мой код, прежде чем подробно рассказывать об этой проблеме. Это мой лексер:Непреднамеренная конкатенация в грамматике Bison/Yacc
%{
#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;
}
Это мой парсер:
%{
#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;
}
очень простой язык, состоящий из не более строк и целых и основной РЕПЛ. Теперь вы заметите в синтаксическом анализаторе, что 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