如何计算bison flex中的语法错误

如何计算bison flex中的语法错误,bison,flex-lexer,Bison,Flex Lexer,我希望我的代码打印输入文件中出现的语法错误的数量。这是我的密码: %{ #include <stdio.h> #include <math.h> void yyerror(char *); extern int yylval; extern FILE *yyin; extern FILE *yyout; extern yylineno; extern int yyparse(void); extern int yylex(void); extern int yywrap(

我希望我的代码打印输入文件中出现的语法错误的数量。这是我的密码:

%{
#include <stdio.h>
#include <math.h>
void yyerror(char *);
extern int yylval;
extern FILE *yyin;
extern FILE *yyout;
extern yylineno;
extern int yyparse(void);
extern int yylex(void);
extern int yywrap() { return 1; }
extern char* yytext;
int errors;
%}

%debug
%start m_class


%token IF ELSE INT CHAR CLASS NEW GURISE VOID WHILE
%token PUBLIC PROTECTED PRIVATE STATIC FINAL ABSTRACT
%token PLUS MINUS MUL DIV MODULO
%token EQ NEQ GRT LT GREQ LEQ
%token OR AND NOT
%token AR_PAR DEK_PAR AR_AGK DEK_AGK AR_STRO DEK_STRO
%token SEMICOLON ANATHESI COMA
%token MY_INT SINT MY_CHAR ID

%right          ANATHESI
%left           OR AND
%nonassoc       EQ NEQ GRT LT GREQ LEQ
%left           PLUS MINUS MUL DIV MODULO
%right          NOT
%right          "then" ELSE

%%

m_class: m_class class_declaration
        | class_declaration
        | error "\n" {yyerrok; errors++; yyclearin;}
        ;

class_declaration: CLASS ID class_body
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

class_body: AR_STRO variable_declaration constructor method_declaration DEK_STRO
        | error "\n" {yyerrok; errors++;  yyclearin;}
  ;

variable_declaration:variable variable_declaration
        |variable
        |array_declaration
        |array_declaration variable_declaration
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

variable:  var_type ID SEMICOLON
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

var_type: INT
        |CHAR
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

array_declaration: ID ANATHESI NEW var_type AR_AGK MY_INT DEK_AGK SEMICOLON
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;


constructor: modifier ID AR_STRO variable_declaration DEK_STRO
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

modifier: PUBLIC
        | PROTECTED
        | PRIVATE
        | STATIC
        | FINAL
        | ABSTRACT
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;
method_declaration: modifier meth_type ID parameters meth_body
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

meth_type: VOID
        | var_type
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

parameters: AR_PAR par_body DEK_PAR
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

par_body: var_type ID
        | par_body COMA var_type ID
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

meth_body: AR_STRO bodybuilder DEK_STRO
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

bodybuilder: statement GURISE expression SEMICOLON
        |statement bodybuilder
        |statement
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

statement: anathesh
        | if_statement
        | while_statement
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

anathesh:atath SEMICOLON
        | atath numeric_expression SEMICOLON
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

atath: ID ANATHESI orisma
        |ID AR_AGK MY_INT DEK_AGK ANATHESI orisma
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

orisma: ID
        |MY_INT
        |SINT
        |MY_CHAR
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

expression: testing_expression
        | numeric_expression
        | logical_expression
        | ID
        | MY_INT
        | SINT
        | MY_CHAR
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

numeric_expression:  expression PLUS  expression
        | expression MINUS expression
        | expression MUL expression
        | expression DIV expression
        | expression MODULO expression
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

testing_expression: expression EQ expression
        | expression NEQ expression
        | expression GRT expression
        | expression LT expression
        | expression GREQ expression
        | expression LEQ expression
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;
logical_expression: expression OR expression
        | expression AND expression
        | expression NOT expression
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

if_statement: IF sin8iki statement      %prec "then"
        | IF sin8iki statement ELSE statement
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;


sin8iki: AR_PAR testing_expression DEK_PAR
        | AR_PAR logical_expression DEK_PAR
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;

while_statement: WHILE sin8iki statement
        | error "\n" {yyerrok; errors++;  yyclearin;}
        ;


%%


void yyerror(char *s) {
        errors++;
printf("\n------- ERROR AT LINE #%d.\n\n", yylineno);
fprintf(stderr, "%d: error: '%s' at '%s', yylval=%u\n", yylineno, s, yytext, yylval);

}

int main (int argc, char **argv) {
        ++argv;
        --argc;
        errors=0;
        if (argc > 0)
              yyin = fopen (argv[0], "r");
        else
                yyin = stdin;
        yyout = fopen ("output","w");
        yyparse();
        if(errors==0)
                printf("komple");
        else
                printf("la8oi: %d", errors);
        return 0;
}
%{
#包括
#包括
无效错误(字符*);
外部国际组织;
外部文件*yyin;
外部文件*yyout;
外行号;
外部内部解析(无效);
外部内部yylex(无效);
extern int yywrap(){return 1;}
外部字符*文本;
整数错误;
%}
%调试
%开始上课
%令牌IF ELSE INT CHAR CLASS NEW GURISE VOID WHILE
%令牌公共保护私有静态最终摘要
%令牌加减多DIV模
%令牌均衡NEQ GRT LT GREQ LEQ
%象征与否
%代币面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值面值
%象征性分号知觉昏迷
%在我的字符ID中标记我的\u INT
%右感觉
%左或右
%非ASSOC EQ NEQ GRT LT GREQ LEQ
%左加减MUL DIV模
%对不对
%对,那么还有别的吗
%%
m_类:m_类声明
|类别声明
|错误“\n”{yyerrok;errors++;yyclearin;}
;
类声明:类ID类体
|错误“\n”{yyerrok;errors++;yyclearin;}
;
类\u体:AR\u STRO变量\u声明构造函数方法\u声明DEK\u STRO
|错误“\n”{yyerrok;errors++;yyclearin;}
;
变量_声明:变量_声明
|变数
|数组声明
|数组\声明变量\声明
|错误“\n”{yyerrok;errors++;yyclearin;}
;
变量:变量类型ID分号
|错误“\n”{yyerrok;errors++;yyclearin;}
;
变量类型:INT
|煤焦
|错误“\n”{yyerrok;errors++;yyclearin;}
;
数组声明:ID解析新的var类型AR\u AGK MY\u INT DEK\u AGK分号
|错误“\n”{yyerrok;errors++;yyclearin;}
;
构造函数:修饰符ID AR\U STRO变量\U声明DEK\U STRO
|错误“\n”{yyerrok;errors++;yyclearin;}
;
修饰语:公共
|保护
|私人的
|静止的
|决赛
|摘要
|错误“\n”{yyerrok;errors++;yyclearin;}
;
方法声明:修饰符方法类型ID参数方法体
|错误“\n”{yyerrok;errors++;yyclearin;}
;
方法类型:无效
|变型
|错误“\n”{yyerrok;errors++;yyclearin;}
;
参数:AR_PAR PAR_body DEK_PAR
|错误“\n”{yyerrok;errors++;yyclearin;}
;
par_主体:变量类型ID
|par_主体昏迷变量类型ID
|错误“\n”{yyerrok;errors++;yyclearin;}
;
美体:健美运动员DEK_STRO
|错误“\n”{yyerrok;errors++;yyclearin;}
;
bodybuilder:语句GURISE表达式分号
|声明健美运动员
|声明
|错误“\n”{yyerrok;errors++;yyclearin;}
;
声明:阿纳泰什
|if_语句
|while_语句
|错误“\n”{yyerrok;errors++;yyclearin;}
;
anathesh:atath分号
|atath数值表达式分号
|错误“\n”{yyerrok;errors++;yyclearin;}
;
阿塔斯:奥里萨马解剖
|我是奥里萨马学院的学生
|错误“\n”{yyerrok;errors++;yyclearin;}
;
奥里萨马:身份证
|我的心
|辛特
|我的妈妈
|错误“\n”{yyerrok;errors++;yyclearin;}
;
表达式:测试_表达式
|数值表达式
|逻辑表达式
|身份证
|我的心
|辛特
|我的妈妈
|错误“\n”{yyerrok;errors++;yyclearin;}
;
数值表达式:表达式加表达式
|表达式负表达式
|表达式多表达式
|表达式DIV表达式
|表达式模表达式
|错误“\n”{yyerrok;errors++;yyclearin;}
;
测试_表达式:表达式EQ表达式
|表达式NEQ表达式
|表达式GRT表达式
|表达式LT表达式
|表达式GREQ表达式
|表达式LEQ表达式
|错误“\n”{yyerrok;errors++;yyclearin;}
;
逻辑表达式:表达式或表达式
|表达与表达
|表达而非表达
|错误“\n”{yyerrok;errors++;yyclearin;}
;
if_语句:if sin8iki语句%prec“then”
|IF sin8iki语句ELSE语句
|错误“\n”{yyerrok;errors++;yyclearin;}
;
sin8iki:AR_PAR测试
|逻辑表达式
|错误“\n”{yyerrok;errors++;yyclearin;}
;
while_语句:while sin8iki语句
|错误“\n”{yyerrok;errors++;yyclearin;}
;
%%
无效错误(字符*s){
错误++;
printf(“\n------第#%d行出现错误。\n\n”,yylineno);
fprintf(stderr,“%d:错误:“%s”位于“%s”,yylval=%u\n”,yylineno,s,yytext,yylval);
}
int main(int argc,字符**argv){
++argv;
--argc;
误差=0;
如果(argc>0)
yyin=fopen(argv[0],“r”);
其他的
yyin=stdin;
yyout=fopen(“输出”,“w”);
yyparse();
如果(错误==0)
printf(“komple”);
其他的
printf(“la8oi:%d”,错误);
返回0;
}
我试图修改yyerrok,但似乎不行。 我还尝试将yyparse放入for循环中。 在输入文件中,我有5个语法错误,但它只打印1个!!!!!! 有什么想法吗?

制作:

error "\n" {yyerrok; errors++;  yyclearin;}
可能没有达到你的期望

错误
产品与正常产品没有特别不同;主要区别在于
错误
生产与以下令牌(通常是终端)同步。[1] 对于bison来说,双引号字符串(
“foo”
)是有效的终端,但是没有简单的方法来获取相应的令牌号,这使得lexer的生活变得困难。[2] 这不同于单引号字符串(
'a'