我正在尝试为我的 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条经验 获得超5个赞
${abcdef + 123}
不是有效的idEscape
,因为它以 开头${
并以 结尾,而规则均不接受}
这两者。idEscape
您定义它的方式idEscape
仅匹配 和 之间的内容${}
,idEscapeExpr
即匹配整个内容的内容。
因此,您将希望您的测试调用idEscapeExpr
规则而不是idEscape
或更改您正在解析的字符串abcdef + 123
(或为每个字符串进行一个测试)。
- 1 回答
- 0 关注
- 102 浏览
添加回答
举报
0/150
提交
取消