JavaCCを始めたばかりです。しかし、私はそれに対して奇妙な行動をとっています。記号 (+、-、/) で連結され、括弧を含めることができるトークン (文字と数字) の形式で入力を検証したいと考えています。それが理解できたことを願っています:)
メイン メソッドには文字列があり、開き括弧が 1 つと閉じ括弧が 2 つあるため、エラーが発生するはずですが、解析例外が発生しません --> なぜですか?
なぜ例外が発生しないのか、誰にも手がかりがありますか?
私は最初の試行で左再帰と選択の競合に苦しんでいましたが、なんとかそれらを乗り越えることができました. 多分私は問題を導入しましたか?
ああ、おそらく私の解決策はあまり良くありません-この事実を無視してください...または、より良いアドバイスをしてください;-)
ファイル: 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))))