2

言語を解析するために Irony DSL フレームワークを使用しています。この言語では、ドット (.) やマイナス (-) などの特殊文字が含まれていても、文字列を引用符 (") なしで記述できます。

取得したテキスト ファイルを編集して文字列を引用符で囲むと、問題なく解析できます。ただし、ファイルをそのまま読みたい。StartEndSymbol を設定せずに Irony に文字列を解析させるにはどうすればよいですか?

現在のバージョンの Irony (2012_03_15) を使用しています。

4

3 に答える 3

2

サンプルSQL文法を見てください。'.'識別子に。などを含めることができますSELECT a.x FROM table。この場合、「Id」はデリメータのリストになります。

var dot = ToTerm(".");
var dash = ToTerm("-");
var Id_simple = TerminalFactory.CreateSqlExtIdentifier(this, "id_simple"); //covers normal identifiers (abc) and quoted id's ([abc d], "abc d")
Id.Rule = MakePlusRule(Id, dot, Id_simple) | MakePlusRule(Id, dash, Id_simple)

 //Covers simple identifiers like abcd, and also quoted versions: [abc d], "abc d".
    public static IdentifierTerminal CreateSqlExtIdentifier(Grammar grammar, string name) {
      var id = new IdentifierTerminal(name);
      StringLiteral term = new StringLiteral(name + "_qouted");
      term.AddStartEnd("[", "]", StringOptions.NoEscapes);
      term.AddStartEnd("\"", StringOptions.NoEscapes);
      term.SetOutputTerminal(grammar, id); //term will be added to NonGrammarTerminals automatically 
      return id;
    }

SQLで機能する場合は、機能するはずです。

于 2012-07-25T11:11:13.203 に答える
1

明確にしてみましょう。CreateSqlExtIdentifier クラスの "id" 変数の宣言: "//abcd のような単純な識別子と、引用されたバージョンの [abc d]、"abc d"、およびアンダースコアと数字をカバーしますが、それ以上はカバーしません。その事実、その SQL パーサーはドットを受け入れます"id" のような部分 - ダウン フォロー ルールの結果です: **"Id.Rule = MakePlusRule(Id, dot, Id_simple);"** 解決策として、特殊文字 (あまりない場合) を宣言し、カスタム ルールを作成して、可能なアペレンスをコードで囲むことができます.
例:
specialSymbols.Rule = ToTerm(".") | "-" | ...etc.;
myId.Rule = id_simple | specialSymbols;
myIds.Rule = MakePlusRule(myIds<,Delimiter if nedeed>,myId);

よろしく、ディオニス。

于 2016-03-18T07:47:15.590 に答える
0

私はまた、これを行うための適切な方法を見たいと思います。現在、コンストラクターで必要な追加文字を設定することにより、IdentifierTerminalを使用しています。

于 2012-07-24T15:37:30.343 に答える