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

我正在尝试为我的 ANTLR 解析器定义单元测试。单元测试成功提取第一个 expr 的值,但未能提取第一个 idEscape 的值。这表明我误解了解析器工作方式或访问者工作方式的核心内容。


我正在编写一个用于 FileMaker Pro 中计算的解析器。在 FileMaker 中,标识符包含空格以及运算符和其他字符在技术上是有效的,否则这些字符在计算引擎中具有功能用途。在这些情况下,标识符通过用“${”和“}”包围来进行转义。虽然解析器成功将“${abcdef + 123}”识别为有效表达式,但我仍然需要能够将“abcdef + 123”识别为有效标识符。当我在第二个单元测试中请求第一个 idEscape 的值时,我得到一个空字符串。如果相关,我正在使用 ANTLR4.Runtime.Standard。


我究竟做错了什么?任何有助于解决我的误解的帮助将不胜感激。谢谢。


语法

grammar FileMakerCalc;  


// PARSER RULES


calculation :   expr;

expr        :   idEscExpr;

idEscExpr   :   LEFTESCAPE idEscape RIGHTESCAPE;

idEscape    :   (WORD|WS|OPERATOR|INT|FLOAT)*?;



// LEXER RULES


fragment 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;

        }


DIEA
浏览 71回答 1
1回答

ibeautiful

${abcdef + 123}不是有效的idEscape,因为它以 开头${并以 结尾,而规则均不接受}这两者。idEscape您定义它的方式idEscape仅匹配 和 之间的内容${},idEscapeExpr即匹配整个内容的内容。因此,您将希望您的测试调用idEscapeExpr规则而不是idEscape或更改您正在解析的字符串abcdef + 123(或为每个字符串进行一个测试)。
打开App,查看更多内容
随时随地看视频慕课网APP