Antlr4 语法中后缀和前缀子规则的不同结果

Antlr4 语法中后缀和前缀子规则的不同结果,antlr4,Antlr4,我有一个ANTLR4语法,它有一些规则试图匹配语言中表达式的部分应用。将其简化,规则如下所示: grammar PartialExpression; program : (function '.')+ ; function : name '=>' expression (';' expression)* ; name : SYMBOL ; expression : functionCall | cl

我有一个ANTLR4语法,它有一些规则试图匹配语言中表达式的部分应用。将其简化,规则如下所示:

grammar PartialExpression;

program
    :   (function '.')+
    ;

function
    :   name '=>' expression (';' expression)*
    ;

name
    :   SYMBOL
    ;

expression
    :   functionCall
    |   closure
    |   literal
    |   expression binaryOperator expression
    |   unaryOperator expression
    |   '(' expression ')'
    ;

functionCall
    :   name
    ;

closure
    :   '[' '=>'? expression (';' expression)* ']'
    |   '[' partialExpression ']'  
    ;

partialExpression
    :   binaryOperator expression # leftPartialExpression
    |   expression binaryOperator # rightPartialExpression
    ;

unaryOperator
    :   ('-' | '+' | '~')
    ;

binaryOperator
    :   ('=' | '<' | '>' | '@' | '^' | '+' | '-' | '*' | '/' | '$' | '!' | ':' | '|')+
    ;

literal
    :   NUMBER
    ;

SYMBOL
    :   ('a'..'z'| 'A'..'Z')+
    ;

NUMBER
    :   '-'? [0-9]+ ('.' [0-9]+)? ([eE] '-'? [0-9]+)?
    ;

WS
    :   [ \n\r\t\,] -> skip
    ;

COMMENT
    :   '%' ~[\r\n]* -> skip
    ;
代码的预期输出为
m
。实际输出为
m*


由于规则的性质是左递归,这是预期的吗?

我将程序转换为C,并从printer类中删除了
static
,输出是您预期的
m

在RightPartialPressionContext中也只有两个孩子

也许你可以粘贴你的输出或者发布一个显示三个孩子的调试窗口截图

    private static void partialExpressionTest()
    {
        AntlrInputStream input = new AntlrInputStream("fc => [m *].");
        PartialExpressionLexer lexer = new PartialExpressionLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        PartialExpressionParser parser = new PartialExpressionParser(tokens);
        ParseTreeWalker walker = new ParseTreeWalker();
        Printer printer = new Printer();

        walker.Walk(printer, parser.program());
        // prints "Right Expression: m"
    }


public class Printer : PartialExpressionBaseListener
{
    override public void EnterRightPartialExpression(PartialExpressionParser.RightPartialExpressionContext ctx)
    {
        Console.WriteLine("Right Expression: " + ctx.expression().GetText());
    }

    override public void EnterLeftPartialExpression(PartialExpressionParser.LeftPartialExpressionContext ctx)
    {
        Console.WriteLine("Left Expression: " + ctx.expression().GetText());
    }
}

你能发布一篇包含一些输入的文章吗?@BartKiers,我已经在示例中添加了完整的语法和测试代码。我还发现它只发生在ANTLR 4.2下。根据4.2.1,它不会发生。
    private static void partialExpressionTest()
    {
        AntlrInputStream input = new AntlrInputStream("fc => [m *].");
        PartialExpressionLexer lexer = new PartialExpressionLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        PartialExpressionParser parser = new PartialExpressionParser(tokens);
        ParseTreeWalker walker = new ParseTreeWalker();
        Printer printer = new Printer();

        walker.Walk(printer, parser.program());
        // prints "Right Expression: m"
    }


public class Printer : PartialExpressionBaseListener
{
    override public void EnterRightPartialExpression(PartialExpressionParser.RightPartialExpressionContext ctx)
    {
        Console.WriteLine("Right Expression: " + ctx.expression().GetText());
    }

    override public void EnterLeftPartialExpression(PartialExpressionParser.LeftPartialExpressionContext ctx)
    {
        Console.WriteLine("Left Expression: " + ctx.expression().GetText());
    }
}