在我的詞法分析器檔案中,我為標記“名稱”設定了“yylval.str = yytext”。然后在我的野牛檔案中,我嘗試讀取該 str 值以將名稱作為字串獲取。但是,當我閱讀 $2 時,我最終不僅得到了令牌名稱,而且還得到了該行的其余部分。
例如,一行可以是“MOVE Z TO XY”,其中 Z 和 XY 都是名稱。在這種情況下,我希望 $2 的值是“Z”,而 $4 的值是“XY”。但實際發生的是 $2 的值是“Z TO XY”,而 $4 的值是“XY”。我想 $4 也有同樣的問題,但在行尾沒有其他內容,因此不會引起任何問題。
為什么 $2 會像這樣給出該行的整個剩余部分?如何獲取變數名?
(縮短)詞法分析器代碼:
"MOVE" {return (MOVE);}
"TO" {return (TO);}
([0-9]) {yylval.num = atoi(yytext); return (INTEGER);}
[a-z][a-z0-9\-]* {yylval.str = _strlwr(yytext); return (NAME);}
(縮短)決議器代碼:
%token MOVE
%token TO
%token <num> INTEGER
%token <str> NAME
%union{
int num;
char *str;
}
move:
MOVE NAME TO NAME PERIOD { printf("<Var1: %s>, <Var2: %s>", $2, $4);}
| MOVE INTEGER TO NAME PERIOD { printf("<Val: %d>, <Var: %s>", $2, $4); }
輸入:
MOVE Z TO XY-1
MOVE 15 TO XY-1
輸出:
<Var1: z TO xy-1>, <Var2: xy-1>
<Val: 15>, <Var: xy-1>
uj5u.com熱心網友回復:
在我的詞法分析器檔案中,我為標記“名稱”設定了“yylval.str = yytext”。然后在我的野牛檔案中,我嘗試讀取該 str 值以將名稱作為字串獲取。但是,當我閱讀 $2 時,我最終不僅得到了令牌名稱,而且還得到了該行的其余部分。
這一點也不奇怪。 yytext是指向輸入緩沖區的指標 (in),從當前匹配的位置開始。當決議器查看指向的資料時,它們通常不是字串,因為通常沒有緊跟令牌字符的字串終止符(但見下文)。
此外,當決議器開始查看令牌的語意值時,詞法分析器可能已將新資料讀入輸入緩沖區,將原始令牌文本從您的下方拉出。
如何獲取變數名?
要將令牌文本獲取為您以后可以訪問的字串,并確保它不會被您修改,您需要制作它的副本。那可能需要在動態分配的記憶體中。 僅在詞法分析器操作中,您可以依賴 Flex 提供了一個臨時字串終止符,因此您可以使用strdup()(如果有的話)制作這樣的副本。您似乎正在使用 Microsoft 的 C 庫,它確實有strdup.
然后:
[a-z][a-z0-9\-]* {
char *temp = strdup(yytext);
if (temp == NULL) { /* handle allocation error*/}
else {
yylval.str = _strlwr(temp); return (NAME);
}
}
您需要確保在不再需要標記的動態分配的語意值時,決議器會在指向它們的指標丟失之前釋放它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467408.html
上一篇:如果兩個數字是相同的0,則在C 和Root中設定0條件
下一篇:如何使用C正確接收串行資料?
