2011-04-02 32 views
3

在利用ANTLR 3.3的优势时,我改变了当前的语法来支持没有括号的输入。下面是我的语法的第一个版本:ANTLR BNF语法符号中的epsilon等价物是什么?

grammar PropLogic; 

     NOT : '!' ; 
     OR : '+' ; 
     AND : '.' ; 
     IMPLIES : '->' ; 
     SYMBOLS : ('a'..'z') | '~' ; 
     OP : '(' ; 
     CP : ')' ; 

    prog : formula EOF ; 


    formula : NOT formula 
     | OP formula(AND formula CP | OR formula CP | IMPLIES formula CP) 
     | SYMBOLS ; 


    WHITESPACE : ('\t' | ' ' | '\r' | '\n'| '\u000C')+ { $channel = HIDDEN; } ; 

然后,我改变了这种方式来支持相应的功能:

grammar PropLogic; 

    NOT : '!' ; 
    OR : '+' ; 
    AND : '.' ; 
    IMPLIES : '->' ; 
    SYMBOL : ('a'..'z') | '~' ; 
    OP : '(' ; 
    CP : ')' ; 
    EM : '' ; 

prog : formula EOF ; 


formula : OP formula(AND formula CP | OR formula CP | IMPLIES formula CP) 
    | (NOT formula | SYMBOL)(AND formula | OR formula | IMPLIES formula | EM) ; 


WHITESPACE : ('\t' | ' ' | '\r' | '\n'| '\u000C')+ { $channel = HIDDEN; } ; 

但我一直面临着以下错误:

error<100>: syntax error: invalid char literal: '' 
error<100>: syntax error: invalid char literal: '' 

有谁知道我该如何克服这个错误?

回答

4

EM令牌:

EM : '' ; 

是无效的:你不能匹配词法规则一个空字符串。

为了配合小量(没有),你应该做的:

rule 
    : A 
    | B 
    | /* epsilon */ 
    ; 

当然,评论/* epsilon */可以安全地取出。

请注意,当您在当前文法中使用它时,ANTLR会抱怨使用多个替代方法可能存在匹配的规则。这是因为你的语法不明确。

+0

好吧,我改变了语法,并根据您的预期,它不起作用。我只是试图验证输入来检查,如果它是一个命题逻辑声明或不。 – Amirh 2011-04-02 10:56:39

+0

@Amirh,我说只是简单地应用我刚刚回答的问题就会导致ANTLR产生错误。我刚回答你的问题,为什么你得到了错误:'错误<100>:语法错误:无效的字面量:'''。祝你好运。 – 2011-04-02 14:57:52

+0

感谢您将您的答案带回。那么我怎样才能使它工作?它只是一个命题逻辑语法。 btw基于Ira的语法,我可以访问pars树的元素吗?我只是想将一些字符串转换为另一个等效形式?然后找到位于根上的' - >'并用其他子树递归地执行。这是否可以通过艾拉的语法来实现? – Amirh 2011-04-02 15:53:10

2

我不是ANTLR专家,但你可以尝试:

formula : term ((AND | OR | IMPLIES) term)*; 
term : OP formula CP | NOT term | SYMBOL ; 

如果你想运营商,这将无法胜任传统的优先级,但这是另一个问题。

编辑:OP提出了赌注;他也想要优先。我会半路见他,因为它不是原始问题的一部分 。我已经给文法增加了优先级,使得IMPLIES 比其他操作符的优先级低,并且让它去找出如何完成剩下的操作。

formula: disjunction (IMPLIES disjunction)* ; 
disjunction: term ((AND | OR) term)* ; 
term: OP formula CP | NOT term | SYMBOL ; 

OP另外问:“如何将(!p或q)转换为p - > q”。我认为他应该把 作为一个单独的问题。但是,我已经在这里。 他需要做的是走树,寻找他不喜欢的模式,并将树改为他所做的模式,然后相当印上答案。 ANTLR可以做到这一切,这是它受欢迎的原因之一 的一部分。

作为一个实际问题,程序化地行走树并检查节点类型,并且拼接出旧节点和新拼接是可行的,但是是皇家PitA。 特别是如果你想要做很多转换。

更有效的方法是使用一个 program transformation system,它允许表面语法模式表示匹配和替换。程序转换系统当然包括解析机制和更强大的解析机制,让你(并且确实坚持)你像定义ANTLR一样定义了一个语法前面的文法。

我们DMS Software Reengineering Toolkit是这样一个程序转换工具,并与命题适当定义的语法, 以下DMS转换规则将进行OP的附加要求:

domain proplogic; // tell DMS to use OP's definition of logic as a grammar 

rule normalize_implies_from_or(p: term, q: term): formula -> formula 
    " NOT \p OR \q " -> " \p IMPLIES \q "; 

的“...”是“域记号“,例如来自proplogic域的表面句法,”\“是元转义字, ,因此”\ p“和”\ q“表示来自proplogic语法的任意术语。注意规则在应用时必须达到“跨越”优先级,因为“NOT \ p OR \ q”不是公式并且“\ p IMPLIES \ q”是; DMS负责所有这些(“公式 - >公式”符号是DMS如何知道该怎么做的)。此规则执行树对树重写。由此产生的树可以被DMS打印出来。

您可以看到一个非常相似的完整示例,例如a grammar for conventional algebra and rewrite rule to simplify algebraic equations

+0

@Amirh,正如Ira已经提到的那样,如果你想要运算符优先级,你需要改变你的解析器规则。有了Ira的建议,您的来源只需从左到右进行评估。 – 2011-04-02 11:04:43

+0

@Bart Kiers,是的,谢谢你的提示。其实我还没有完成。我会问更多的问题。你知道这只是第二个。 – Amirh 2011-04-02 11:07:41

+0

只是想确保你明白这不是一个“希望”没有得到运营商优先级困难的问题。如果你想有'AND','OR'或'IMPLIES'具有比其他的更低(或更高)的优先级,你需要改变你的语法分析器的规则。无论如何,祝你好运! – 2011-04-02 11:14:15

相关问题