刚开始使用 JavaCC。但我有一个奇怪的行为。我想以标记(字母和数字)的形式验证输入,这些标记与符号(+、-、/)连接,并且可以包含括号。我希望这是可以理解的:)
在 main 方法中是一个字符串,它应该会产生错误,因为它有一个左括号和两个右括号,但是我没有得到解析异常 --> 为什么?
有人知道为什么我没有得到例外吗?
我在最初的尝试中遇到了左递归和选择冲突,但设法克服了它们。也许那里是我介绍的问题?!
哦 - 也许我的解决方案不是很好 - 忽略这个事实......或者更好,给一些建议;-)
文件:CodeParser.jj
options {
STATIC=false;
}
PARSER_BEGIN(CodeParser)
package com.testing;
import java.io.StringReader;
import java.io.Reader;
public class CodeParser {
public CodeParser(String s)
{
this((Reader)(new StringReader(s)));
}
public static void main(String args[])
{
try
{
/** String has one open, but two closing parenthesis --> should produce parse error */
String s = "A+BC+-(2XXL+A/-B))";
CodeParser parser = new CodeParser(s);
parser.expression();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
PARSER_END(CodeParser)
TOKEN:
{
<code : ("-")?(["A"-"Z", "0"-"9"])+ >
| <op : ("+"|"/") >
| <not : ("-") >
| <lparenthesis : ("(") >
| <rparenthesis : (")") >
}
void expression() :
{
}
{
negated_expression() | parenthesis_expression() | LOOKAHEAD(2) operator_expression() | <code>
}
void negated_expression() :
{
}
{
<not>parenthesis_expression()
}
void parenthesis_expression() :
{
}
{
<lparenthesis>expression()<rparenthesis>
}
void operator_expression() :
{
}
{
<code><op>expression()
}
编辑 - 2009 年 11 月 16 日
现在我尝试了ANTLR。
我更改了一些术语以更好地匹配我的问题域。我想出了以下代码(使用本网站上的答案),现在似乎可以完成工作:
grammar Code;
CODE : ('A'..'Z'|'0'..'9')+;
OP : '+'|'/';
start : terms EOF;
terms : term (OP term)*;
term : '-'? CODE
| '-'? '(' terms ')';
顺便说一句... ANTLRWORKS 是一个很好的调试/可视化工具!帮了我很多。
附加信息
上面的代码匹配如下内容:
(-Z19+-Z07+((FV+((M005+(M272/M276))/((M278/M273/M642)+-M005)))/(FW+(M005+(M273/M278/M642)))))+(-Z19+-Z07+((FV+((M005+(M272/M276))/((M278/M273/M642/M651)+-M005)))/(FW+(M0))))