#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;
перед правилами, которые вы показываете, поэтому оно улавливает любое число из одного символа,