簡體   English   中英

Antlr4語法左遞歸錯誤

[英]Antlr4 grammar left recursive error

我現在對antlr4有很大的疑問。
每當我嘗試使用該RPN語法填充antlr時

 grammar UPN;

    //Parser  

    expression : plus | minus | mult | div | NUMBER;  
    plus : expression expression '+';  
    minus : expression expression '-';  
    mult : expression expression '*';  
    div : expression expression '/';  

    //Lexer  
    NUMBER : '-'? ('0'..'9')+;  

antlr會引發錯誤,因為plus,minus,mult和div是相互左遞歸的。
我不知道該如何解決。
(我知道發生這種情況是因為使用這種語法“表達式”可以無限循環,在使用另一種語法之前我曾遇到過這個問題,但是我可以自己解決這個問題)

我唯一的解決方案是按以下方式限制語法

grammar UPN;

//Parser

expression : plus | minus | mult | div | NUMBER;
exp2 : plus2 | minus2 | mult2 | div2 | NUMBER;
plus : exp2 exp2'+';
minus : exp2 exp2'-';
mult: exp2 exp2'*';
div: exp2 exp2'/';
plus2 : NUMBER NUMBER '+';
minus2 : NUMBER  NUMBER '-';
mult2: NUMBER  NUMBER '*';
div2: NUMBER  NUMBER '/';

//Lexer
NUMBER : '-'? ('0'..'9')+;  

但這並不是我真正想要的,因為現在我可以使用諸如

2 3 + 5 4 - *

語法會比實際復雜得多。
希望你們能幫助我

ANTLR4僅支持“直接”左遞歸規則,不支持“間接”。

嘗試這樣的事情:

grammar RPN;

parse : expression EOF;

expression
 : expression expression '+'
 | expression expression '-'
 | expression expression '*'
 | expression expression '/'
 | NUMBER
 ;

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

SPACES : [ \t\r\n] -> skip;

順便說一句, 23+54-*不是有效的RPN表達式:它必須以兩個數字開頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM