Только что начал с 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()
}
Редактировать - 11/16/2009
Теперь я попробовал 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))))