我正在嘗試為我的 ANTLR 解析器定義單元測試。單元測試成功提取第一個 expr 的值,但未能提取第一個 idEscape 的值。這表明我誤解了解析器工作方式或訪問者工作方式的核心內(nèi)容。我正在編寫一個用于 FileMaker Pro 中計算的解析器。在 FileMaker 中,標(biāo)識符包含空格以及運算符和其他字符在技術(shù)上是有效的,否則這些字符在計算引擎中具有功能用途。在這些情況下,標(biāo)識符通過用“${”和“}”包圍來進行轉(zhuǎn)義。雖然解析器成功將“${abcdef + 123}”識別為有效表達式,但我仍然需要能夠?qū)ⅰ癮bcdef + 123”識別為有效標(biāo)識符。當(dāng)我在第二個單元測試中請求第一個 idEscape 的值時,我得到一個空字符串。如果相關(guān),我正在使用 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條經(jīng)驗 獲得超6個贊
${abcdef + 123}
不是有效的idEscape
,因為它以 開頭${
并以 結(jié)尾,而規(guī)則均不接受}
這兩者。idEscape
您定義它的方式idEscape
僅匹配 和 之間的內(nèi)容${}
,idEscapeExpr
即匹配整個內(nèi)容的內(nèi)容。
因此,您將希望您的測試調(diào)用idEscapeExpr
規(guī)則而不是idEscape
或更改您正在解析的字符串abcdef + 123
(或為每個字符串進行一個測試)。
- 1 回答
- 0 關(guān)注
- 136 瀏覽
添加回答
舉報
0/150
提交
取消