Программа Yacc принимает только целые числа, превышающие 1

#yacc #lex

Вопрос:

Я создал файл lex и yacc, чтобы определить язык для беспилотных летательных аппаратов. У меня проблема с целочисленными выражениями, используемыми в коде. Когда я анализирую код, int a = 1; строка выдает синтаксическую ошибку , но int a = 1; , int a = -1; и int a = 11; ( любое целое число с более чем 1 цифрой) не выдает никакой синтаксической ошибки.

Это определенные токены для нескольких типов в моем файле .l.

 DIGIT [0-9] CAPITAL_LETTER [A-Z] LOWER_LETTER [a-z] LETTER {CAPITAL_LETTER}|{LOWER_LETTER} IDENTIFIER {LOWER_LETTER}({LETTER}|{DIGIT}|{UNDERSCORE})* TEXT ({LETTER}|{DIGIT}|{UNDERSCORE})* STRING_STMT "(.)*" BOOL_STMT {TRUE}|{FALSE} INTEGER [ -]?{DIGIT}  FLOAT_UNSIGNED {DIGIT}*(.)?{DIGIT}  FLOAT_SIGNED [ -]?{DIGIT}*(.)?{DIGIT}  CHAR_STMT '[^\']' INCREMENT_STMT    DECREMENT_STMT --  

Это та часть, где я возвращаю их для файла yacc:

 {BOOL_STMT} return BOOL_STMT; {STRING_STMT} return STRING_STMT; {CONST_IDENTIFIER} return CONST; {INTEGER} return INTEGER; {FLOAT_UNSIGNED} return FLOAT_UNSIGNED; {FLOAT_SIGNED} return FLOAT_SIGNED; {CHAR_STMT} return CHAR_STMT;  

Это некоторые файлы yacc, включая правило для целочисленных выражений и некоторые другие выражения:

 program:  main  main:  START_STMT statements END_STMT  statements:   statement|statements statement  statement:  comment|expr SEMICOLON|loops|method_dec|conditional  //comment comment:  LINE_COMMENT|DOC_COMMENT_START TEXT DOC_COMMENT_END   //expr semicolon expr:  assignment_expr  |IDENTIFIER DOT builtIn_method  |method_dec_call  |inout_expr  assignment_expr:  var_declaration|general_expr|int_expr|float_expr|bool_expr  |string_expr|char_expr|input_expr|method_expr  var_declaration:  TYPE IDENTIFIER  general_expr:  IDENTIFIER ASSIGN_OP TEXT|IDENTIFIER ASSIGN_OP STRING_STMT  int_expr:  TYPE IDENTIFIER ASSIGN_OP INTEGER  float_expr:  TYPE IDENTIFIER ASSIGN_OP float  float:  FLOAT_SIGNED|FLOAT_UNSIGNED  bool_expr:  TYPE IDENTIFIER ASSIGN_OP BOOL_STMT  string_expr:  TYPE IDENTIFIER ASSIGN_OP STRING_STMT  char_expr:  TYPE IDENTIFIER ASSIGN_OP CHAR_STMT  input_expr:  IDENTIFIER ASSIGN_OP ICARUS_IN LSB RSB  method_expr:   TYPE IDENTIFIER ASSIGN_OP IDENTIFIER DOT builtIn_method  |IDENTIFIER ASSIGN_OP IDENTIFIER DOT builtIn_method   builtIn_method:  READ_HEADING LSB RSB|READ_ALTITUDE LSB RSB|READ_TEMPERATURE LSB RSB|SET_MOVE LSB MOVEMENT RSB  |SET_MOVE LSB MOVEMENT COMMA INTEGER RSB|SET_HEADING LSB INTEGER RSB|SET_HEADING LSB IDENTIFIER RSB  |SET_NOZZLE LSB BOOL_STMT RSB|SET_NOZZLE LSB IDENTIFIER RSB|CONNECT_WIFI LSB RSB|DISCONNECT_WIFI LSB RSB  

Что я упускаю? Спасибо.

Комментарии:

1.Вам не хватает той части программы, которая вызывает ошибку, так как неполный фрагмент, который вы показываете, приведет к ошибкам во время компиляции, и если вы их исправите, это должно работать просто отлично. Лучше всего предположить, что у вас есть правило lex, например: . return *yytext; перед правилами, которые вы показываете, поэтому оно улавливает любое число из одного символа,