gpt4 book ai didi

java - ANTLR "no viable alternative at input"解析 SAS 代码时出错 If Then Else

转载 作者:行者123 更新时间:2023-11-29 08:30:38 28 4
gpt4 key购买 nike

我是 ANTLR 的新手,正在研究一个解析器来解析主要由 if then else if 语句组成的 SAS 代码。我创建了以下语法来解析代码,但是当我尝试使用示例应用程序运行时,我在 Intellij 中遇到错误。

创建的语法:

grammar SASDTModel;

parse
: if_block+
| score_block
;

//Model
// : If_block+
// | Score_block
// ;

if_block
: (if_statement|if_in_block)
| else_if_statement+
| else_statement
;

if_statement
: IF '(' if_condition ')' THEN Identifier'='Value ';'
| IF Identifier'='Value THEN Identifier'='Value ';'
;
else_if_statement
: ELSEIF '(' if_condition ')' THEN Identifier'='Value ';'
| ELSEIF Identifier'='Value THEN Identifier'='Value ';'
;

if_condition
: Value ComparisionOperators Identifier ComparisionOperators Value
| Value ComparisionOperators Value;


else_statement
: ELSE Identifier'='Value ';'
;

if_in_block
: IF Identifier IN '(' StringArray ')' THEN Identifier'='Value ';'
;

score_block
: Identifier'='Arithmetic_expression ';'
;

Arithmetic_expression:
| ( ArithmeticOperators '(' Value ')' )+
| ( ArithmeticOperators '(' Value ArithmeticOperators Identifier ')' )+
;
WS : ( ' ' | '\t' | '\r' | '\n' )-> channel(HIDDEN);
//WS : [ \t\n\r]+ -> channel(HIDDEN) ;
//WS : (' ' | '\t')+ -> channel(HIDDEN);
//COMMENT : '/*' .*? '*/' -> skip ;
//LINE_COMMENT : '*' ~[\r\n]* -> skip ;

ArithmeticOperators:
| '+'
| '-'
| '*'
| '/'
| '**'
;

ComparisionOperators
: '=='
| '<'
| '>'
| '<='
| '>='
;

IF: 'IF' | 'if' ;
ELSE: 'ELSE' | 'else' ;
ELSEIF: 'ELSE IF' | 'else if' ;
THEN: 'THEN' | 'then';
IN: 'IN' | 'in';


Value : INT
| DOUBLE
| '-'DOUBLE
| '-'INT
| Identifier
|'null';


INT : [0-9];
DOUBLE : INT+ PT INT+
| PT INT+
| INT+
;
PT : '.';

Identifier : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')* ;

StringArray : (('\'')(Value)('\''))+;

输入:

if  scored = null then  scored = -0.05;
else if ( 0 < scored <= 300 ) then scored = -0.5;
else if ( 300 < scored <= 500 ) then scored = -0.4;
else if ( 500 < scored <= 800 ) then scored = -0.8;
else if ( 800 < scored <= 1000 ) then scored = 0.9;
else if ( scored > 1000 ) then scored = 1.735409628;
else scored = 0;

错误我得到

line 1:4 no viable alternative at input 'IF  scored'
line 1:61 mismatched input '<=' expecting ')'
line 1:112 mismatched input '<=' expecting ')'
line 1:163 mismatched input '<=' expecting ')'
line 1:214 mismatched input '<=' expecting ')'
line 1:276 mismatched input 'scored' expecting Identifier
line 1:303 mismatched input 'scored' expecting Identifier

所有错误代码都是 1: 因为我正在预处理 SAS 代码并删除所有注释并转换为单行。

因此在预处理之后输入被转换为以下:`

IF scored = null THEN scored = -0.05;ELSE IF ( 0 < scored <= 300 ) THEN scored = -0.5;ELSE IF ( 300 < scored <= 500 ) THEN scored = -0.4;ELSE IF ( 500 < scored <= 800 ) THEN scored = -0.8;ELSE IF ( 800 < scored <= 1000 ) THEN scored = 0.9;ELSE IF ( scored > 1000 ) THEN scored = 1.735409628;ELSE scored = 0;

`

最佳答案

以下是一些可能会导致问题的事情:

  • 通过使 StringArray : (('\'')(Value)('\''))+; 成为词法分析器规则,您将只匹配 'foo123mu'(没有空格的值)。您应该使 StringArray 成为解析器规则(然后 Value 也应该成为解析器规则)
  • 您的else If 规则:ELSEIF: 'ELSE IF' | 'else if' ; 相当脆弱:只要 ELSEIF 之间有 2 个或更多空格,您的规则将不会匹配。您应该删除此规则并在解析器规则中使用现有的 ELSEIF 规则
  • 规则 ArithmeticOperatorsArithmetic_expression 匹配空字符串。 Lexer 规则绝不能匹配空字符串(杠杆可以产生无限量的空字符串标记)
  • 杠杆规则 Arithmetic_expression 应该是解析器规则:每当杠杆规则用于将其他标记相互“粘合”时,您应该将它们“提升”为解析器规则
  • 您的词法分析器规则命名约定不一致:使用 PascalCasseUPPER_CASE,不能同时使用
  • 如前所述,INT : [0-9]; 应该是 INT : [0-9]+; 否则 4 会被标记为 INT42DOUBLE

这些只是我在阅读您的问题时看到的一些内容,因此可能还有更多内容不正确。我建议您在尝试编写 SAS 语法之前先花时间学习更多的 ANTLR。或者,更好的是,尝试为这种语言找到一个现有的 (ANTLR) 语法,而不是自己编写。

这是一个您可以看一看的现有的:https://github.com/xueqilsj/sas-grammar (不知道它有多准确)

关于java - ANTLR "no viable alternative at input"解析 SAS 代码时出错 If Then Else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48561861/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com