Java ANTLR命题逻辑求值器
我试图在ANTLR中创建一个语法,用于评估命题逻辑公式。因此,对于输入Java ANTLR命题逻辑求值器,java,eclipse,antlr,evaluate,Java,Eclipse,Antlr,Evaluate,我试图在ANTLR中创建一个语法,用于评估命题逻辑公式。因此,对于输入(1&0)|1,它应该返回true 我构建了以下内容: code returns[boolean value] : formula EOF {$value = $formula.value;} ; formula returns [boolean value] : equiv {$value = $equiv.value;} ; equiv returns [boolean value] : a=i
(1&0)|1
,它应该返回true
我构建了以下内容:
code returns[boolean value]
: formula EOF {$value = $formula.value;}
;
formula returns [boolean value]
: equiv {$value = $equiv.value;}
;
equiv returns [boolean value]
: a=implies {$value = $a.value;}
( '#' b=implies {$value = $value == $b.value;}
)*
;
implies returns [boolean value]
: a=or {$value = $a.value;}
( '>' b=or {$value = !$value || $b.value;}
)*
;
or returns [boolean value]
: a=and {$value = $a.value;}
( '|' b=and {$value ||= $b.value;}
)*
;
and returns [boolean value]
: a=term {$value = $a.value;}
( '&' b=term {$value &&= $b.value;}
)*
;
term returns [boolean value]
: '(' formula ')' {$value = $formula.value;}
| '0' {$value = false;}
| '1' {$value = true;}
| '¬' term {$value = !$term.value;}
;
WHITESPACE: (' '|'\t'|'\r'|'\f'|'\n')+{$channel = HIDDEN;} ;
但是,我不断收到错误java.lang.NoSuchFieldError:InkingToken。是否仍有办法找出错误所在或如何修复它?有三个问题:
应该是{$value | |=b.value;}
{$value=$value | |=b.value;}
应该是{$value&&=$b.value;}
{$value=$value&&$b.value;}
规则第四个备选方案中的标签术语
不明确:is可能指规则本身,或者$term
后跟术语
,
即,以下各项:
code returns[boolean value]
: formula EOF {$value = $formula.value;}
;
formula returns [boolean value]
: equiv {$value = $equiv.value;}
;
equiv returns [boolean value]
: a=implies {$value = $a.value;}
( '#' b=implies {$value = $value == $b.value;}
)*
;
implies returns [boolean value]
: a=or {$value = $a.value;}
( '>' b=or {$value = !$value || $b.value;}
)*
;
or returns [boolean value]
: a=and {$value = $a.value;}
( '|' b=and {$value ||= $b.value;}
)*
;
and returns [boolean value]
: a=term {$value = $a.value;}
( '&' b=term {$value &&= $b.value;}
)*
;
term returns [boolean value]
: '(' formula ')' {$value = $formula.value;}
| '0' {$value = false;}
| '1' {$value = true;}
| '¬' term {$value = !$term.value;}
;
WHITESPACE: (' '|'\t'|'\r'|'\f'|'\n')+{$channel = HIDDEN;} ;
术语返回[布尔值]
: ...
|“,”术语{$value=!$term.value;}
;
应该是:
术语返回[布尔值]
: ...
|“,”t=term{$value=!$t.value;}
;
做出这些更改后,以下测试类别:
import org.antlr.runtime.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
字符串源=“(1&0)| 1”;
TestLexer lexer=新的TestLexer(新的AntlStringStream(源));
TestParser=newtestparser(newcommontokenstream(lexer));
System.out.println(source+“=”+parser.code());
}
}
产生所需的输出:
java-cp antlr-3.3.jar org.antlr.Tool Test.g
javac-cp antlr-3.3.jar*.java
java-cp.:antlr-3.3.jar Main
(1和0)| 1=真
作为一名非ANTLR专家,我通过查看生成的Java代码来调试这些问题。您的堆栈跟踪应该包括行号,并且生成的代码将有注释,指示表示规则的哪一部分。非常感谢您的帮助!我试着跟随你之前关于评估+,-,/,*操作的一篇文章,但看不出我在这里出了什么错。我真的以为| |=和&&=会被允许的。再次感谢你!