ANTLR循环逻辑

时间:2014-03-22 23:56:00

标签: parsing syntax antlr antlr4 lexer

我目前正在尝试在ANTLR中实现一种简单的语言。问题是我不知道如何绕过我的循环逻辑,或者如何将其分解出来。当我测试它时,一切都被声明为sexp,它不会深入到最终类型。任何帮助,将不胜感激。有没有办法对每种类型的算子进行性别分析?

我也得到错误: 第2:0行输入'

没有可行的选择

尝试解析以下代码时

(+ 2 3)

语言的一个例子是这样的:

添加2到3 - > (+ 2 3)

添加2到(2乘以3) - > (+ 2(* 2 3))

它基本上是一个运算符,后跟两个表达式,即操作数。

这就是我所拥有的:

词法分析:

lexer grammar LizpLexer;
WS: [ \t\r\n] -> skip;

TRUE: 'true';
FALSE: 'false';
AND: 'and';
OR: 'or';
NOT: 'not';
LPARENT: '(';
RPARENT: ')';
ADD: '+';
SUBTRACT: '-';
ABSOLUTE: 'abs';
CEILING: 'ceil';
FLOOR: 'floor';
ROUND: 'round';
MULTIPLY: '*';
DIVIDE: '/';
MAX: 'max';
MIN: 'min';
EQUALS: '=';
NEQUALS  : '/=';  
GTEQUALS : '>=';  
LTEQUALS : '<=';  
GT       : '>';  
LT       : '<'; 
PRINT: 'print';
CONDITIONAL: 'cond';
IF: 'if';
SET: 'set';


NUMBER: DIGIT+ ('.' DIGIT*)?;
fragment CHAR: [_a-zA-Z];
fragment DIGIT: [0-9];

ID: CHAR (CHAR | DIGIT)*;

和解析器

parser grammar LizpParser;

options {tokenVocab=LizpLexer;}

program : sexp+ EOF;

sexp 
    : atom 
    | arithexpr 
    | relexpr 
    | boolexpr 
    | conexpr 
    | printexpr 
    | bindexpr
    ;

atom
    : ID | NUMBER;

arithexpr
    : unaryexpr 
    | binaryexpr 
    | naryexpr
    ;

unaryexpr 
    : LPARENT unaryOp sexp RPARENT
    ;

unaryOp 
    : SUBTRACT 
    | ABSOLUTE 
    | CEILING
    | FLOOR
    | ROUND
    ;

binaryexpr 
    : LPARENT binaryOp sexp sexp RPARENT
    ;

binaryOp 
    : DIVIDE
    ;

naryexpr 
    : LPARENT naryOp sexp sexp+ RPARENT
    ;

naryOp 
    : ADD 
    | MULTIPLY 
    | MAX 
    | MIN
    ;

relexpr 
    : LPARENT relOp sexp sexp RPARENT
    ;

relOp 
    : EQUALS
    | NEQUALS 
    | LT 
    | GT 
    | LTEQUALS 
    | GTEQUALS
    ;


boolexpr 
    : notexpr 
    | andexpr 
    | orexpr
    ;

notexpr 
    : LPARENT NOT sexp RPARENT
    ;

andexpr 
    : LPARENT AND sexp+ RPARENT
    ;

orexpr 
    : LPARENT OR sexp+ RPARENT
    ;

conexpr 
    : ifexpr 
    | condexpr
    ;

ifexpr 
    : LPARENT IF sexp sexp sexp? RPARENT
    ;

condexpr 
    : LPARENT CONDITIONAL sexp+ RPARENT
    ;

printexpr 
    : LPARENT PRINT sexp+ RPARENT
    ;

bindexpr 
    : LPARENT SET ID sexp RPARENT
    ;

1 个答案:

答案 0 :(得分:1)

你的语法为我工作。注意我使用的是ANTLR v4.2 Java目标。这是我使用(+ 2 3)生成的TestRig生成的解析树:

enter image description here

如果您正在使用C#目标,请再次使用Java目标查看是否遇到相同的问题。我的印象是C#目标仍然包含错误。