我的問題是,傳遞給yyerror
的消息已經格式化(即它實際上是一個英文解釋出了什麼問題),我想得到的只是當前的標記(即錯誤僞標記之前的標記) 。如何在yyerror中獲取當前令牌?
那麼如何得到它呢?
我使用gplex/gppg,它們是C#中的lex/yacc實現。
不好意思不爲100%準確 - 我需要的是令牌(符號)不是身體這是匹配(令牌)(文本)。
比方說,我有一個規則[A-Za-z0-9_]+
構成ID
。所以我想獲得代幣ID
不是foobar
。
我的問題是,傳遞給yyerror
的消息已經格式化(即它實際上是一個英文解釋出了什麼問題),我想得到的只是當前的標記(即錯誤僞標記之前的標記) 。如何在yyerror中獲取當前令牌?
那麼如何得到它呢?
我使用gplex/gppg,它們是C#中的lex/yacc實現。
不好意思不爲100%準確 - 我需要的是令牌(符號)不是身體這是匹配(令牌)(文本)。
比方說,我有一個規則[A-Za-z0-9_]+
構成ID
。所以我想獲得代幣ID
不是foobar
。
有沒有標準,但野牛和yacc的大多數版本存儲當前令牌yychar
。不幸的是,這通常是一個局部變量(yyparse
),所以您不能在其他函數(如yyerror
)中訪問它,只能在解析器操作中訪問它。
如果你說爲什麼你想要當前令牌可能會有幫助 - 它通常不是有用的信息。你提到錯誤的僞標記,這是沒有意義的,因爲這與錯誤恢復相關,而不是錯誤 - 當它進入圖片時,通常來自輸入的一串標記已被丟棄。
在我的一個老項目中找到這一點,與重新定位的yyerror:
int yyerror (char *msg) {
printf("oha, %s: '%s' in line %d\n", msg, yytext, yylineno);
return 0;
}
這是一個C++ - 項目使用Flex /野牛和有趣的事情,我認爲你可以在yytext中找到。
謝謝,我並不確切,對不起。 'yytext'給出了令牌的內容,而不是令牌本身。 – greenoldman
嗯。再看看那個舊項目,我在詞法分析器文件中做了什麼,而不是「{」return LCB;我用「{」return isWat(LCB);. 在這是w-routine我檢查我在上面的yyerror例程中設置的錯誤標誌(爲了避免混淆,我刪除了該代碼),並且如果設置爲輸出標識id。當然,它的一小部分工作,因爲每個令牌都是通過這個程序返回的。但它的工作。但也許有更好的解決方案... – pbhd
再次感謝你。到目前爲止,我做了一個小小的駭人聽聞 - 我仔細看了這條消息是如何形成的,並且直接訪問令牌的領域。 – greenoldman
謝謝。我希望當前令牌顯示自定義消息,因此我要解析消息或獲取消息的組件,並顯示自己的消息。爲了使用舊項目進行自動測試,我必須擁有自己的信息。否則,每個工具(Bison,Yacc,CUP,你的名字),你都必須跳大圈,以確保你的輸出是否仍然相同。錯誤僞令是有道理的,我提到它避免了答案「嘿,當前令牌是錯誤令牌」。 – greenoldman
@macias:對於自定義錯誤消息,通常你想要的是'yytext' - 最後一個匹配的標記的文本,而不是令牌代碼。但是你明確地說你不想要文字。 –
天哪,謝謝你告訴我我想要什麼。請尊重別人的需要,事實是不尋常的,並不意味着你必須強迫這個或那個解決方案或POV。我需要令牌代碼,句點。 – greenoldman