在利用ANTLR 3.3的过程中,我正在更改当前语法以支持不带括号的输入。这是我的语法的第一个版本:
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: ''
有人知道我该如何克服这个错误?
您的EM
令牌:
EM : '' ;
无效:您无法在lexer规则中匹配空字符串。
要匹配epsilon(什么都没有),您应该执行以下操作:
rule
: A
| B
| /* epsilon */
;
当然,/* epsilon */
可以安全删除评论。
请注意,当您按照当前语法那样进行操作时,ANTLR会抱怨可能存在使用多个替代规则进行匹配的规则。这是因为您的语法不明确。
问题内容: 我想知道,是否有Python等效的case语句,例如VB.net或C#上可用的示例? 问题答案: 例如: 然后,调用等效的开关块: 如果你严重依赖失败,就会开始崩溃。
问题内容: 有Swift的等效项吗?在中,我们通常使用: 如何在Swift中实现相同目标?我发现了一个功能: 但是,它很长,根本不方便。 问题答案: 将在斯威夫特的世界同样存在。 的,和参数均标有 该装置的同时调用该函数我们可以忽略这些参数的关键字。在这种情况下,将使用其默认值。 这得出一个结论,该方法调用可以简化为: Swift 5- 没什么变化,仍然可以这样工作。
问题内容: 在TSQL中,我可以声明: 在MySQL中,我无法编写相同的查询。 在MySQL中编写此查询的正确方法是什么? 问题答案: 行尾的分号。
问题内容: 我有以下代码,该代码将字符串作为输入,并转换为UNIX时间戳。我想在golang中做同样的事情,但我无法识别将在Go中提供等效于DateTimeOffset结构的结构或函数。 例如: 输入:635804753769100000 输出:1444878577 UTC对应时间:10/15/2015 3:09:36 AM +00:00 有人可以帮我解决这个问题,以获得上述结果。 谢谢 问题答案
问题内容: Golang中C ++的等效功能是什么? 根据这里的问题,我可以得到以下声明: 但这将导入整个名称空间。现在我只想使用诸如定义之类的东西 Go中有与此等效的功能,因此我不必一直输入吗? 问题答案: 以下代码在可读性方面接近,但效率较低,因为编译器无法再内联函数调用。 而且,它具有输入名称的副作用,并到该文件的范围,这恐怕是C ++的没有做。
问题内容: LINQ的Java等效项是什么? 问题答案: 现在使用Java 8向我们介绍了Stream API,这在处理集合时是类似的事情,但与Linq不太一样。 如果它是您正在寻找的ORM,例如Entity Framework,那么您可以尝试Hibernate