为了账号安全,请及时绑定邮箱和手机立即绑定

ANTLR 访问者单元测试在一条规则上成功,但在另一条规则上失败

ANTLR 访问者单元测试在一条规则上成功,但在另一条规则上失败

C#
DIEA 2023-09-24 15:53:04
我正在尝试为我的 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(或为每个字符串进行一个测试)。


查看完整回答
反对 回复 2023-09-24
  • 1 回答
  • 0 关注
  • 66 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信