ANTLR命题逻辑评估器

编程入门 行业动态 更新时间:2024-10-08 02:26:59
本文介绍了ANTLR命题逻辑评估器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试在ANTLR中创建一种语法以评估命题逻辑公式.因此对于输入(1 & 0) | 1,它应该返回true.

I'm trying to create a grammar in ANTLR that evaluates propositional logic formulas. So for the input (1 & 0) | 1, it should return 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 .无论如何,有没有找出错误的根源或如何解决?

However I keep getting the error java.lang.NoSuchFieldError: offendingToken. Is there anyway to find out where the error is or how to fix it?

推荐答案

存在3个问题:

  • {$value ||= $b.value;}应该是{$value = $value || $b.value;}
  • {$value &&= $b.value;}应该是{$value = $value && $b.value;}
  • 在term规则的第四个替代中的标签$term是不明确的:可以引用规则本身,或者是term后跟'¬'
  • {$value ||= $b.value;} should be {$value = $value || $b.value;}
  • {$value &&= $b.value;} should be {$value = $value && $b.value;}
  • the label $term in the fourth alternative of the term rule is ambiguous: is could refer to the rule itself, or the term followed by '¬'

即以下内容:

I.e., the following:

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

应该是:

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

进行了这些更改,以下测试类:

Having made those changes, the following test class:

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

更多推荐

ANTLR命题逻辑评估器

本文发布于:2023-11-28 18:47:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1643550.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:命题   逻辑   ANTLR

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!