2

命題論理式を評価する 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: offendingTokenが引き続き発生します。エラーがどこにあるか、またはそれを修正する方法を見つける方法はありますか?

4

1 に答える 1

2

3 つの問題があります。

  • {$value ||= $b.value;}する必要があります{$value = $value || $b.value;}
  • {$value &&= $b.value;}する必要があります{$value = $value && $b.value;}
  • $termルールの 4 番目の選択肢のラベルtermがあいまいです: ルール自体を参照するか、termその後に'¬'


つまり、次のとおりです。

term returns [boolean value]
  : ...
  | '¬' term {$value = !$term.value;}
  ;

次のようにする必要があります。

term returns [boolean value]
  : ...
  | '¬' t=term {$value = !$t.value;}
  ;

これらの変更を行った後、次のテスト クラス:

import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    String source = "(1 & 0) | 1";
    TestLexer lexer = new TestLexer(new ANTLRStringStream(source));
    TestParser parser = new TestParser(new CommonTokenStream(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 = true
于 2013-06-11T18:15:54.867 に答える