我正在嘗試為我的 ANTLR 解析器定義單元測試。單元測試成功提取第一個 expr 的值,但未能提取第一個 idEscape 的值。這表明我誤解了解析器工作方式或訪問者工作方式的核心內容。我正在編寫一個用于 FileMaker Pro 中計算的解析器。在 FileMaker 中,標識符包含空格以及運算符和其他字符在技術上是有效的,否則這些字符在計算引擎中具有功能用途。在這些情況下,標識符通過用“${”和“}”包圍來進行轉義。雖然解析器成功將“${abcdef + 123}”識別為有效表達式,但我仍然需要能夠將“abcdef + 123”識別為有效標識符。當我在第二個單元測試中請求第一個 idEscape 的值時,我得到一個空字符串。如果相關,我正在使用 ANTLR4.Runtime.Standard。我究竟做錯了什么?任何有助于解決我的誤解的幫助將不勝感激。謝謝。語法grammar FileMakerCalc; // PARSER RULEScalculation : expr;expr : idEscExpr;idEscExpr : LEFTESCAPE idEscape RIGHTESCAPE;idEscape : (WORD|WS|OPERATOR|INT|FLOAT)*?;// LEXER RULESfragment LOWERCASE : [a-z] ;fragment UPPERCASE : [A-Z] ;LEFTESCAPE : '${';RIGHTESCAPE : '}';OPERATOR : ('+'|'-'|'*'|'/'|'&'|'^'|'='|'≠'|'<>'|'>'|'<'|'≤'|'<='|'≥'|'>=' );WORD : (LOWERCASE | UPPERCASE)+ ;FLOAT : [0-9]+ '.' [0-9]+;INT : [0-9]+ ;NEWLINE : [\r\n]+ ;WS : [ \t];游客public class FileMakerCalcVisitor : FileMakerCalcBaseVisitor<String>{ public override string VisitExpr(FileMakerCalcParser.ExprContext context) { return context.GetText(); } public override string VisitIdEscape(FileMakerCalcParser.IdEscapeContext context) { return context.GetText(); }}單元測試namespace Antler_Tests{ [TestFixture()] public class ParserTest { private FileMakerCalcParser Setup(string text) { AntlrInputStream inputStream = new AntlrInputStream(text); FileMakerCalcLexer lexer = new FileMakerCalcLexer(inputStream); CommonTokenStream commonTokenStream = new CommonTokenStream(lexer); FileMakerCalcParser parser = new FileMakerCalcParser(commonTokenStream); return parser; }
1 回答

ibeautiful
TA貢獻1993條經驗 獲得超6個贊
${abcdef + 123}
不是有效的idEscape
,因為它以 開頭${
并以 結尾,而規則均不接受}
這兩者。idEscape
您定義它的方式idEscape
僅匹配 和 之間的內容${}
,idEscapeExpr
即匹配整個內容的內容。
因此,您將希望您的測試調用idEscapeExpr
規則而不是idEscape
或更改您正在解析的字符串abcdef + 123
(或為每個字符串進行一個測試)。
- 1 回答
- 0 關注
- 139 瀏覽
添加回答
舉報
0/150
提交
取消