Libdevhelp問題発生するコードを探知していないのではないすべてのパースエラー
-
19-09-2019 - |
質問
始めたばかりとLibdevhelp.しかし不思議な振る舞いをします。I確認したい入力intのトークン(文字や数字)が既に処理してくれるかどうかは,記号(+,-,/)は、ヤを含むことができ括弧.いば:)
のmainメソッドが文字列は、ステートメントがエラーを発生で一口が閉括弧が、初期費用等は一切頂きません構文解析例外-->なぜですか?
は誰もいかんないの?
まず左再帰や紛争と最初はみなされました。ん、ありがとうございまい問題なのでしょうか。!
Ohそしておそらく私の溶液は良くない-を無視すること...または、より良い相談;-)
ファイル: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
またAOETOOLSいただけるミュージアムです。
しか語り合っ問題。また、次のコードを用いの答えがこのサイト)をしているように見えて、現在:
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))))
解決
何kgregoryの言うことは正しい答えです。あなたはDEBUG_PARSERオプションで文法を構築し、それを実行する場合は、これを見ることができます:
$ javacc -debug_parser -output_directory=com/testing/ CodeParser.jj && javac com/testing/*.java && java -cp . com.testing.CodeParser Java Compiler Compiler Version 5.0 (Parser Generator) (type "javacc" with no arguments for help) Reading from file CodeParser.jj . . . File "TokenMgrError.java" is being rebuilt. File "ParseException.java" is being rebuilt. File "Token.java" is being rebuilt. File "SimpleCharStream.java" is being rebuilt. Parser generated successfully. Call: expression Call: operator_expression Consumed token: <<code>: "A" at line 1 column 1> Consumed token: <<op>: "+" at line 1 column 2> Call: expression Call: operator_expression Consumed token: <<code>: "BC" at line 1 column 3> Consumed token: <<op>: "+" at line 1 column 5> Call: expression Call: negated_expression Consumed token: <"-" at line 1 column 6> Call: parenthesis_expression Consumed token: <"(" at line 1 column 7> Call: expression Call: operator_expression Consumed token: <<code>: "2XXL" at line 1 column 8> Consumed token: <<op>: "+" at line 1 column 12> Call: expression Call: operator_expression Consumed token: <<code>: "A" at line 1 column 13> Consumed token: <<op>: "/" at line 1 column 14> Call: expression Consumed token: <<code>: "-B" at line 1 column 15> Return: expression Return: operator_expression Return: expression Return: operator_expression Return: expression Consumed token: <")" at line 1 column 17> Return: parenthesis_expression Return: negated_expression Return: expression Return: operator_expression Return: expression Return: operator_expression Return: expression
それを参照してください?右括弧を最後まで二 - 消費最後のトークンは、最後の文字に2番目です。
あなたは例外をしたい場合は、、再び、kgregoryようにあなたは、「ファイル」または「データ」か何かと呼ばれる新しいトップレベルの生産を追加し、トークンを使用して、それを終わらせることができ、と述べました。そうすれば、このような任意のぶら下がり括弧は、エラーが発生します。ここではそれを行う文法があります:
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.file(); } catch(Exception e) { e.printStackTrace(); } } } PARSER_END(CodeParser) TOKEN: { <code : ("-")?(["A"-"Z", "0"-"9"])+ > | <op : ("+"|"/") > | <not : ("-") > | <lparenthesis : ("(") > | <rparenthesis : (")") > } void file() : {} { expression() <EOF> } 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() }
そしてサンプル実行ます:
$ javacc -debug_parser -output_directory=com/testing/ CodeParser.jj && javac com/testing/*.java && java -cp . com.testing.CodeParser Java Compiler Compiler Version 5.0 (Parser Generator) (type "javacc" with no arguments for help) Reading from file CodeParser.jj . . . File "TokenMgrError.java" is being rebuilt. File "ParseException.java" is being rebuilt. File "Token.java" is being rebuilt. File "SimpleCharStream.java" is being rebuilt. Parser generated successfully. Call: file Call: expression Call: operator_expression Consumed token: <<code>: "A" at line 1 column 1> Consumed token: <<op>: "+" at line 1 column 2> Call: expression Call: operator_expression Consumed token: <<code>: "BC" at line 1 column 3> Consumed token: <<op>: "+" at line 1 column 5> Call: expression Call: negated_expression Consumed token: <"-" at line 1 column 6> Call: parenthesis_expression Consumed token: <"(" at line 1 column 7> Call: expression Call: operator_expression Consumed token: <<code>: "2XXL" at line 1 column 8> Consumed token: <<op>: "+" at line 1 column 12> Call: expression Call: operator_expression Consumed token: <<code>: "A" at line 1 column 13> Consumed token: <<op>: "/" at line 1 column 14> Call: expression Consumed token: <<code>: "-B" at line 1 column 15> Return: expression Return: operator_expression Return: expression Return: operator_expression Return: expression Consumed token: <")" at line 1 column 17> Return: parenthesis_expression Return: negated_expression Return: expression Return: operator_expression Return: expression Return: operator_expression Return: expression Return: file com.testing.ParseException: Encountered " ")" ") "" at line 1, column 18. Was expecting: <EOF> at com.testing.CodeParser.generateParseException(CodeParser.java:354) at com.testing.CodeParser.jj_consume_token(CodeParser.java:238) at com.testing.CodeParser.file(CodeParser.java:34) at com.testing.CodeParser.main(CodeParser.java:22)
出来上がり!例外ます。
他のヒント
から Java CC FAQ:
4.7になっていたため、LOOKAHEAD仕様との警告もいただけます。となると、私は固定問題なのでしょうか。
No.Libdevhelpませんの報告書の選択に紛争の警告をご利用の場合LOOKAHEAD仕様となります。の な警告 えてくるということではないんだ問題が解決さ けをすることになりますので追加LOOKAHEAD仕様.
いように紛争を使用せずにlookaheadます。
問題は正しい、パーサを使用しているときにエラーが出ていないということですか?パーサジェネレータは、(他の回答での議論であるように思われた)文法が間違っていると主張されていないこと。
その場合は、、その後、私はあなたが問題を見ていると思われるパーサが適切にの表現の生産を一致するため、その後の入力を無視します。私は長い間、JavaCCのを使用していないが、IIRC、それはストリームの終わりに達していないため、エラーをスローしませんでした。
ほとんどの文法は、この(私が言ったように私はそれは長い時間がかかった、構文が間違っていると確信している)のようなものを探して、ファイル全体に一致するように、明示的なトップレベルの生産を持っています
input : ( expression ) *
それとも、あなただけの単一の式を処理したい場合は、使用できることをEOFトークンはおそらくあります。