簡體   English   中英

在野牛中有一種方法可以返回令牌的名稱而不是其類型

[英]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 該名稱還將顯示在野牛語法中未使用的任何單字符標記。

yytnameyytranslate都在bison生成的掃描程序中聲明為static const ,因此您只能在該文件中存在的代碼中使用它們。 如果要公開一個執行翻譯的函數,可以在第二個%%之后將函數放在語法結尾中。 (例如,如果您想在掃描儀中找到與令牌編號對應的名稱,則可能需要這樣的功能。)它可能如下所示:

const char token_name(int t) {
  return yytname[YYTRANSLATE(t)];
}

通常,沒有必要這樣做。 如果您只想跟蹤解析器正在執行的操作,那么啟用bison的跟蹤功能會更好。

bison生成一個名為yytokentypeenum ,其中包含語法中所有標記的枚舉列表。 它不提供與包含所有令牌名稱的字符串的等效映射。

所以,你必須自己實現這個映射。 也就是說,實現一個帶有yytokentype參數的實用程序函數,並返回給定標記的名稱,您可以隨后在診斷消息中使用該名稱。 另一個無聊的switch農場。

話雖如此,編寫一個實用程序Perl腳本或等效的,讀取來自bison的<filename>.tab.h ,解析yytokentype枚舉,並且yytokentype生成映射函數應該不會太困難。 使用合適的依賴關系規則將其粘貼到Makefile ,您就擁有了一個自動生成的令牌到名稱映射函數生成器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM