[英]In bison is there a way to return the Name of a token instead of its type
我正在與Flex和Bison合作。 在我的parse.y(野牛)我定義了令牌。 當令牌返回時,它返回一個int我想知道是否有辦法獲取該int並將其映射回bison源中的實際名稱。 例如在我的parser.y中
//define my tokens that are shared with my lexer (flex)
%token <tokenData> ID
%token <tokenData> NUMCONST
在我的語法中我然后使用
number : NUMCONST {std::cout<<"Line "<<$1->linenum<<" Token: [I want NUMCONST]"<<<std::endl;}
我知道我可以顯示從詞法分析器返回的int但是在那里返回令牌的類型,例如“NUMCONST”或“ID”。 我想要令牌“類型”而不是令牌“int”
是的,你可以,但你需要在你的野牛文件中啟用該功能。
如果將指令%token-table
放入bison文件中,那么bison將生成一個名為yytname
的令牌名稱表。 (您也可以使用-k
或--token-table
命令行標志啟用此功能。)
yytname[i]
是“內部野牛令牌代碼編號”為i
的令牌的名稱。 這與yylex
返回的數字不同,因為bison使用名為yytranslate
的(未記錄的)表對令牌進行yytranslate
。
如果使用該功能, yytname
表中的令牌名稱是令牌別名 。 例如,如果您的語法包括:
%token EQEQ "=="
%%
exp: exp "==" exp
| exp '+' exp
對應於exp
規則中顯示的兩個運算符的標記的名稱是"=="
和'+'
。
yytname
還包括非終端的名稱,以防您出於任何目的需要。
您可能希望使用YYTRANSLATE(t)
,而不是使用yytranslate[t]
,這是野牛生成的掃描程序本身所做的。 該宏將超出范圍的整數轉換為2
,其具有相應的名稱$undefined
。 該名稱還將顯示在野牛語法中未使用的任何單字符標記。
yytname
和yytranslate
都在bison生成的掃描程序中聲明為static const
,因此您只能在該文件中存在的代碼中使用它們。 如果要公開一個執行翻譯的函數,可以在第二個%%
之后將函數放在語法結尾中。 (例如,如果您想在掃描儀中找到與令牌編號對應的名稱,則可能需要這樣的功能。)它可能如下所示:
const char token_name(int t) {
return yytname[YYTRANSLATE(t)];
}
通常,沒有必要這樣做。 如果您只想跟蹤解析器正在執行的操作,那么啟用bison的跟蹤功能會更好。
bison
生成一個名為yytokentype
的enum
,其中包含語法中所有標記的枚舉列表。 它不提供與包含所有令牌名稱的字符串的等效映射。
所以,你必須自己實現這個映射。 也就是說,實現一個帶有yytokentype
參數的實用程序函數,並返回給定標記的名稱,您可以隨后在診斷消息中使用該名稱。 另一個無聊的switch
農場。
話雖如此,編寫一個實用程序Perl
腳本或等效的,讀取來自bison的<filename>.tab.h
,解析yytokentype
枚舉,並且yytokentype
生成映射函數應該不會太困難。 使用合適的依賴關系規則將其粘貼到Makefile
,您就擁有了一個自動生成的令牌到名稱映射函數生成器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.