Parsing 分号作为flex/bison解析的自定义语法中的分隔符

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 ; 如

我正在尝试为元编程语言编写一个简单的解析器。 一切正常,但我想用“;”作为语句分隔符,而不是换行符或ommit,完全使用分号

因此,这是预期的行为:

// 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;}