我目前正在尝试在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
;
答案 0 :(得分:1)
你的语法为我工作。注意我使用的是ANTLR v4.2 Java目标。这是我使用(+ 2 3)
生成的TestRig
生成的解析树:
如果您正在使用C#目标,请再次使用Java目标查看是否遇到相同的问题。我的印象是C#目标仍然包含错误。