Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing ANTLR 4解析时输入不匹配_Parsing_Input_Antlr4_Lexer_Recursive Descent - Fatal编程技术网

Parsing ANTLR 4解析时输入不匹配

Parsing ANTLR 4解析时输入不匹配,parsing,input,antlr4,lexer,recursive-descent,Parsing,Input,Antlr4,Lexer,Recursive Descent,我正在使用ANTLR 4和IntelliJ的第一步。我试图为数学表达式创建一个简单的递归爬升解析器。我犯了一个错误 line 1:0 mismatched input '3' expecting {VARIABLE; REALNUM, INTNUM} 似乎lexer没有正确地将3转换为解析器使用的令牌,但是我没有发现问题所在 Lexer: lexer grammar testLexer; PLUS: '+'; MINUS: '-'; TIMES: '*'; DIV: '/'; SIN: 's

我正在使用ANTLR 4和IntelliJ的第一步。我试图为数学表达式创建一个简单的递归爬升解析器。我犯了一个错误

line 1:0 mismatched input '3' expecting {VARIABLE; REALNUM, INTNUM}
似乎lexer没有正确地将3转换为解析器使用的令牌,但是我没有发现问题所在

Lexer:

lexer grammar testLexer;

PLUS: '+';
MINUS: '-';
TIMES: '*';
DIV: '/';
SIN: 'sin'|'Sin'|'SIN';
COS: 'cos'|'Cos'|'COS';
TAN: 'tan'|'Tan'|'TAN';
LN: 'ln'|'LN'|'Ln';
LOG: 'Log'|'log'|'LOG';
SQRT: 'sqrt'|'Sqrt'|'SQRT';
LBRACE: '(';
RBRACE: ')';
POW: '^';
SPACE: ' ' -> skip;
EQUAL: '=';
VARIABLE: [a-zA-Z][a-zA-Z0-9]*;
INTNUM: [0-9]+;
REALNUM: [0-9]+[,|.][0-9]+;
WS: [\r\t\n]+ -> skip;
SEMICOLON: ';';
解析器:

分析器

 grammar testParser;
expression returns [double value]
    : exp=additiveExpression {$value = $exp.value;};
equalityExpression returns [double value]
: m1 = additiveExpression (EQUAL additiveExpression)* {$value = $m1.value;};
additiveExpression returns [double value]
: m2 =  multiplikativeExpression {$value = $m2.value;}
    (PLUS m1=multiplikativeExpression {$value += $m1.value;}
    |MINUS m1=multiplikativeExpression {$value -= $m1.value;}
    )* ;
multiplikativeExpression returns [double value]
: m3 = powExpression {$value = $m3.value;}
(TIMES powExpression {$value *= $m3.value;}
|DIV powExpression {$value /= $m3.value;}
)* ;
powExpression returns [double value]
: (bracedExpression)
(POW (m4=expression) {$value = Math.pow($value, $m4.value);}
)*;
bracedExpression returns [double value]
: (LBRACE m5 = expression RBRACE {$value = $m5.value;}
|LBRACE m6 = unaryExpression RBRACE {$value = $m6.value;}
| m7 =unaryExpression {$value = $m7.value;});
unaryExpression returns [double value]
: m7= atomExpression {$value = $m7.value;}
| (SIN m6=bracedExpression {$value = Math.sin($m6.value);}
   |COS m6=bracedExpression {$value = Math.cos($m6.value);}
   |TAN m6=bracedExpression {$value = Math.tan($m6.value);}
   |LOG m6=bracedExpression {$value = Math.log($m6.value);}
   |SQRT  m6=bracedExpression {$value = Math.sqrt($m6.value);}
   )
   |EOF;
atomExpression returns [double value]
: VARIABLE {$value = 1;}
|m7 = REALNUM {$value = Double.parseDouble($m7.text);}
| m7 = INTNUM {$value = Integer.parseInt($m7.text);};

输入只是简单的术语3,但在较长的输入字符串(如2+3)上也会出现错误。

您的示例词法对我来说很好。以下是启用了-tokens的TestRig输出:

C:\prj\ANTLR_SO_BENCH\Bench>java org.antlr.v4.gui.TestRig  Grammar1 program -tokens  SOURCE.txt
[@0,0:0='3',<INTNUM>,1:0]
[@1,1:1='+',<'+'>,1:1]
[@2,2:2='2',<INTNUM>,1:2]
[@3,5:4='<EOF>',<EOF>,2:0]
所以根据你的问题,我不确定该推荐什么

C:\prj\ANTLR_SO_BENCH\Bench>java org.antlr.v4.gui.TestRig  Grammar1 program -tokens  SOURCE.txt
[@0,0:3='3.14',<REALNUM>,1:0]
[@1,5:5='*',<'*'>,1:5]
[@2,7:9='2.1',<REALNUM>,1:7]
[@3,12:11='<EOF>',<EOF>,2:0]