You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ANTLR解析SAS代码If Then Else时出现“no viable alternative at input”错误

帮你修正ANTLR SAS If/ElseIf/Else解析语法

嘿,作为ANTLR新手踩语法定义的坑太正常了!我看了你写的SASDTModel语法,发现几个关键问题导致运行报错,下面给你拆解问题并提供修正后的完整语法:

原语法的核心问题

  • if_block结构逻辑错误:原定义允许else_if_statement或else_statement单独出现,这不符合SAS的语法规则——else必须紧跟在if/else if之后,else if也不能独立存在
  • 词法规则缺失:你只写了语法规则,但没定义IF、ELSEIF、THEN这些关键字,还有Identifier、Value、ComparisionOperators的词法识别规则,ANTLR根本不知道怎么识别这些Token
  • if_condition定义不完整:代码里的ComparisionO...是语法截断错误,而且原条件定义太局限,SAS的条件支持逻辑运算符(AND/OR)组合多个比较表达式,你原来的定义覆盖不了这类场景
  • 语句结构不严谨:部分规则里的空格处理、括号匹配逻辑不够清晰

修正后的完整语法

grammar SASDTModel;

// 语法规则
parse : (if_block | score_block)+ EOF;

if_block : if_statement (else_if_statement)* (else_statement)?;

if_statement : IF condition THEN assignment ';' ;
else_if_statement : ELSEIF condition THEN assignment ';' ;
else_statement : ELSE assignment ';' ;

// 支持逻辑运算符组合的条件表达式
condition : comparison_expr (LOGICAL_OP comparison_expr)* ;
comparison_expr : (VALUE | IDENTIFIER) COMPARISON_OP (VALUE | IDENTIFIER) ;

// 赋值语句
assignment : IDENTIFIER '=' VALUE ;

score_block : SCORE IDENTIFIER '=' VALUE ';' ; // 假设score_block是类似Score Var=100;的结构

// 词法规则(注意关键字要放在IDENTIFIER前面,避免被识别为标识符)
IF : 'IF' | 'if';
ELSEIF : 'ELSEIF' | 'elseif' | 'ElseIf';
ELSE : 'ELSE' | 'else';
THEN : 'THEN' | 'then';
SCORE : 'SCORE' | 'score';

COMPARISON_OP : '=' | '>' | '<' | '>=' | '<=' | '^=' | '~=';
LOGICAL_OP : 'AND' | 'and' | 'OR' | 'or';

IDENTIFIER : [a-zA-Z_][a-zA-Z0-9_]*;
VALUE : [0-9]+ ('.' [0-9]+)? | '"' ~["]* '"' | '\'' ~[']* '\''; // 支持数值、双引号/单引号字符串

// 忽略空格、制表符、换行符
WS : [ \t\r\n]+ -> skip;

关键改动说明

  1. 修正if_block结构:改成if_statement + 可选多个else_if_statement + 可选else_statement,完全符合SAS的If/ElseIf/Else嵌套逻辑
  2. 补全词法规则:定义了所有需要的关键字、运算符、标识符和值的识别规则,还添加了忽略空白字符的规则(ANTLR必须显式处理空白)
  3. 扩展条件表达式:支持用AND/OR组合多个比较条件,覆盖SAS里常见的条件写法
  4. 统一语句结构:把赋值语句抽成单独的assignment规则,让语法更清晰易维护

测试示例

你可以用这段SAS代码测试修正后的语法:

IF Age > 18 THEN AdultFlag="Y";
ELSEIF Age <= 18 THEN AdultFlag="N";
ELSE AdultFlag="U";

Score Total=100;

内容的提问来源于stack exchange,提问作者Ajay Sant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:12:20