2012-11-06 48 views
1

我的問題是,傳遞給yyerror的消息已經格式化(即它實際上是一個英文解釋出了什麼問題),我想得到的只是當前的標記(即錯誤僞標記之前的標記) 。如何在yyerror中獲取當前令牌?

那麼如何得到它呢?

我使用gplex/gppg,它們是C#中的lex/yacc實現。


不好意思不爲100%準確 - 我需要的是令牌(符號)不是身體這是匹配(令牌)(文本)。

比方說,我有一個規則[A-Za-z0-9_]+構成ID。所以我想獲得代幣ID不是foobar

回答

1

有沒有標準,但野牛和yacc的大多數版本存儲當前令牌yychar。不幸的是,這通常是一個局部變量(yyparse),所以您不能在其他函數(如yyerror)中訪問它,只能在解析器操作中訪問它。

如果你說爲什麼你想要當前令牌可能會有幫助 - 它通常不是有用的信息。你提到錯誤的僞標記,這是沒有意義的,因爲這與錯誤恢復相關,而不是錯誤 - 當它進入圖片時,通常來自輸入的一串標記已被丟棄。

+0

謝謝。我希望當前令牌顯示自定義消息,因此我要解析消息或獲取消息的組件,並顯示自己的消息。爲了使用舊項目進行自動測試,我必須擁有自己的信息。否則,每個工具(Bison,Yacc,CUP,你的名字),你都必須跳大圈,以確保你的輸出是否仍然相同。錯誤僞令是有道理的,我提到它避免了答案「嘿,當前令牌是錯誤令牌」。 – greenoldman

+0

@macias:對於自定義錯誤消息,通常你想要的是'yytext' - 最後一個匹配的標記的文本,而不是令牌代碼。但是你明確地說你不想要文字。 –

+0

天哪,謝謝你告訴我我想要什麼。請尊重別人的需要,事實是不尋常的,並不意味着你必須強迫這個或那個解決方案或POV。我需要令牌代碼,句點。 – greenoldman

2

在我的一個老項目中找到這一點,與重新定位的yyerror:

int yyerror (char *msg) { 
    printf("oha, %s: '%s' in line %d\n", msg, yytext, yylineno); 
    return 0; 
} 

這是一個C++ - 項目使用Flex /野牛和有趣的事情,我認爲你可以在yytext中找到。

+0

謝謝,我並不確切,對不起。 'yytext'給出了令牌的內容,而不是令牌本身。 – greenoldman

+1

嗯。再看看那個舊項目,我在詞法分析器文件中做了什麼,而不是「{」return LCB;我用「{」return isWat(LCB);. 在這是w-routine我檢查我在上面的yyerror例程中設置的錯誤標誌(爲了避免混淆,我刪除了該代碼),並且如果設置爲輸出標識id。當然,它的一小部分工作,因爲每個令牌都是通過這個程序返回的。但它的工作。但也許有更好的解決方案... – pbhd

+0

再次感謝你。到目前爲止,我做了一個小小的駭人聽聞 - 我仔細看了這條消息是如何形成的,並且直接訪問令牌的領域。 – greenoldman