Только начал с JavaCC. Но у меня странное поведение с ним. Я хочу проверить ввод в виде токенов (букв и цифр), которые объединены знаками (+, -, /) и могут содержать круглые скобки. Надеюсь понятно было :)
В основном методе есть строка, которая должна выдавать ошибку, потому что у нее одна открывающая и две закрывающие скобки, но я не получаю исключение синтаксического анализа --> Почему?
Кто-нибудь знает, почему я не получаю исключение?
Я боролся с левой рекурсией и конфликтами выбора при первой попытке, но мне удалось их преодолеть. Может, там я привнес проблему?!
О, и, возможно, мое решение не очень хорошее - игнорируйте этот факт... или лучше дайте совет ;-)
Файл: 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()
}
Редактировать — 16.11.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))))