ANTLR4 语法在变量名称中选取"and"和"or"



请帮我学习ANTLR4语法。

样品"formel":

  • (Arbejde.ArbejderIKommuneNr=860)和(Arbehde.ErIArbejde='J')&(Arbejde.ArbejdsTimerPrUge=40)
  • (Ansogeren.BorIKommunen='J')和(BeregnDato(Ansogelen.Fodselsdato;'+62Å')<DagsDato)
  • (Arb.BorI=860)

我的问题是Arb.BorI=860处理不正确。我得到这个错误:

  • 错误:行编号/位置:1/6的输入"(Arb.Bor)"处没有可行的替代方案\r\n异常:Der blev udløst en undtagelse af typen"Antlr4.Runtime.NoViableAltException

请注意,Arb.BorI包含单词"或"。我认为我的问题是语法中的"booleanOps"覆盖了"datakildefelt"

所以。。。我的问题是如何纠正我的语法——我被卡住了,所以任何帮助都将不胜感激。

我的语法:

grammar UnikFormel;
formel  :  boolExpression   # BooleanExpr
        |  expression       # Expr
        | '(' formel ')'    # Parentes;
boolExpression : ( '(' expression ')'  ) ( booleanOps '(' expression ')'  )+;
expression :  element compareOps element    # Compare;
element : datakildefelt     # DatakildeId
        | function          # Funktion
        | int               # Integer
        | decimal           # Real
        | string            # Text;
datakildefelt : datakilde '.' felt;
datakilde : identifyer;
felt : identifyer;
function : funktionsnavn ('(' funcParameters? ')')?;
funktionsnavn : identifyer;
funcParameters : funcParameter (';' funcParameter)*;
funcParameter   : element;
identifyer : LETTER+;
int : DIGIT+;
decimal :   DIGIT+ '.' DIGIT+ | '.' DIGIT+;
string : QUOTE .*?  QUOTE;
booleanOps   : (AND | OR);
compareOps   : (LT | GT | EQ | GTEQ | LTEQ);
QUOTE : ''';
OPERATOR: '+';
DIGIT: [0-9];
LETTER: [a-åA-Å];
MUL   : '*';
DIV   : '/';
ADD   : '+';
SUB   : '-';
GT    : '>';
LT    : '<';
EQ    : '=';
GTEQ  : '>=';
LTEQ  : '<=';
AND   : '&' | 'and';
OR    : '?' | 'or';
WS    : ' '+ -> skip;

先到的规则始终具有优先级。在您的情况下,您需要将ANDOR移动到LETTER之前。GTEQLTEQ也有同样的问题,可能在其他地方也有。

编辑

此外,您应该使identifyer成为lexer规则,即以大写字母(IDENTIFIERIdentifier)开头。intdecimalstring也是如此。输入最初是一个字符流,首先只使用lexer规则处理成一个令牌流。在这一点上,解析器规则(以小写字母开头的规则)还没有发挥作用。因此,要使"BorI"解析为单个实体(令牌),需要创建一个匹配标识符的lexer规则。目前,它将被解析为3个令牌:LETTER(B)OR(或)LETTER(I)。

感谢您的帮助。出现了多个问题。阅读ANTLR4的书并使用"TestRig-gui"让我走上了正轨。工作语法为:

grammar UnikFormel;
formel  : '(' formel ')'    # Parentes
        | expression        # Expr
        | boolExpression    # BooleanExpr
        ;
boolExpression : '(' expression ')' ( booleanOps '(' expression ')'  )+
        | '(' formel ')' ( booleanOps '(' formel ')'  )+;
expression :  element compareOps element    # Compare;
datakildefelt : ID '.' ID;
function : ID ('(' funcParameters? ')')?;
funcParameters : funcParameter (';' funcParameter)*;
funcParameter   : element;
element : datakildefelt     # DatakildeId
        | function          # Funktion
        | INT               # Integer
        | DECIMAL           # Real
        | STRING            # Text;
booleanOps   : (AND | OR);
compareOps   : ( GTEQ | LTEQ | LT | GT | EQ |);
AND   : '&' | 'and';
OR    : '?' | 'or';
GTEQ  : '>=';
LTEQ  : '<=';
GT    : '>';
LT    : '<';
EQ    : '=';
ID : LETTER ( LETTER | DIGIT)*;
INT : DIGIT+;
DECIMAL :   DIGIT+ '.' DIGIT+ | '.' DIGIT+;
STRING : QUOTE .*?  QUOTE;
fragment QUOTE : ''';
fragment DIGIT: [0-9];
fragment LETTER: [a-åA-Å];
WS    : [ trn]+ -> skip;

相关内容

  • 没有找到相关文章

最新更新