我剛開始使用 Flex/Bison,我正在嘗試翻譯類似 pascal 的變數宣告,如下所示:
VAR
V1: INT;
V2: INT;
END_VAR
像這樣的 C 變數宣告:
int main ()
{
int V1;
int V2;
}
我撰寫了描述所需語法的 lex 和 yacc 檔案,然后在 cmd 中使用 flex、bison 和 gcc 實用程式對其進行編譯。這一切都沒有錯誤地完成。但是,當我嘗試在可執行檔案中推送帶有多個變數宣告(與第一個代碼示例相同)的代碼檔案時,我只會得到用 cmd 撰寫的“語法錯誤”。盡管代碼必須非常簡單,但我不知道如何獲取有關此錯誤的任何其他資訊。
- - 更新 - -
我使用了 ?? Tiib 答案,它有助于獲取有關錯誤的資訊。
我在我的 lex 檔案中尋找錯誤:程式需要 ':' 字符,但它遇到了一些未定義的字符。那是因為正則運算式中的空格字符 [; j] 導致詞法分析器將其識別為標記,盡管在正則運算式 [ \t\n] 中應該忽略空格。這就是 lex-file 的樣子:
%{
#include "parser.tab.h"
#include <string.h>
%}
%%
[a-z]([a-z]|[0-9])* {
strcpy (yylval.var, yytext);
return ID;
}
"VAR" { return VAR; }
"END_VAR" { return END_VAR; }
"INT" { return INT; }
[:;] { return *yytext; }
[ \t\n];
%%
int yywrap ()
{
return 1;
}
uj5u.com熱心網友回復:
有關更多資訊錯誤字串,您需要%error-verbose在 yacc 檔案中。也許在您的檔案中是這樣的:
%{
#include <stdio.h>
extern FILE * yyout;
extern char * yylex ();
void yyerror (char *s);
%}
%error-verbose
%union
{
int number;
char var [10];
}
...
有關錯誤分析的更多資訊在手冊中,您的問題并不表明您的學習有多遠。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/364389.html
上一篇:某些文本輸入導致陣列越界
