Parsing 分号作为flex/bison解析的自定义语法中的分隔符
我正在尝试为元编程语言编写一个简单的解析器。 一切正常,但我想用“;”作为语句分隔符,而不是换行符或ommit,完全使用分号 因此,这是预期的行为:Parsing 分号作为flex/bison解析的自定义语法中的分隔符,parsing,grammar,bison,yacc,flex-lexer,Parsing,Grammar,Bison,Yacc,Flex Lexer,我正在尝试为元编程语言编写一个简单的解析器。 一切正常,但我想用“;”作为语句分隔符,而不是换行符或ommit,完全使用分号 因此,这是预期的行为: // good code v1 = v2; v3 = 23; 应该无错误地进行分析 但是: 应该失败 但是,如果我从分隔符中删除“空”规则,两个代码都会失败,如下所示: ID to ID Error detected in parsing: syntax error, unexpected ID, expecting SEMICOLON ; 如
// good code
v1 = v2;
v3 = 23;
应该无错误地进行分析
但是:
应该失败
但是,如果我从分隔符中删除“空”规则,两个代码都会失败,如下所示:
ID to ID
Error detected in parsing: syntax error, unexpected ID, expecting SEMICOLON
;
如果我将'empty'规则保留为活动状态,则两个代码都被接受,这是不需要的
ID to ID // should raise error
ID to NUM;
这里欢迎任何帮助,因为大多数教程根本不包含分隔符
以下是我的解析器/词表分析器的简化版本:
parser.l:
没关系。。。有问题的一行是:
';' {return SEMICOLON;}
哪些需要更改为
";" {return SEMICOLON;}
现在行为是正确的。:-)
%{
#include<stdio.h>
#include<string.h>
%}
%error-verbose
%union{
char *str;
}
%token <str> ID
%token <str> NUM
%token <str> STRING
%left SEMICOLON
%left ASSIGNMENT
%start input
%%
input: /* empty */
| expression separator input
;
expression: assign
| error {}
;
separator: SEMICOLON
| empty
;
empty:
;
assign: ID ASSIGNMENT ID { printf("ID to ID"); }
| ID ASSIGNMENT STRING { printf("ID to STRING"); }
| ID ASSIGNMENT NUM { printf("ID to NUM"); }
;
%%
yyerror(char* str)
{
printf("Error detected in parsing: %s\n", str);
}
main()
{
yyparse();
}
$>flex -t parser.l > parser.lex.yy.c
$>bison -v -d parser.y
$>cc parser.tab.c parser.lex.yy.c -lfl -o parser
';' {return SEMICOLON;}
";" {return SEMICOLON;}