Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
Java ANTLR命题逻辑求值器_Java_Eclipse_Antlr_Evaluate - Fatal编程技术网

Java 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

我试图在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=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;}
  • 术语
    规则第四个备选方案中的标签
    $term
    不明确:is可能指规则本身,或者
    术语
    后跟

即,以下各项:

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代码来调试这些问题。您的堆栈跟踪应该包括行号,并且生成的代码将有注释,指示表示规则的哪一部分。非常感谢您的帮助!我试着跟随你之前关于评估+,-,/,*操作的一篇文章,但看不出我在这里出了什么错。我真的以为| |=和&&=会被允许的。再次感谢你!