1

ユーザーからのSTRINGを期待するルールがあります。現在、文法で定義したキーワードをユーザーが指定すると、パーサーはセグメンテーション エラーを返します。

例:

sampleClause: calc! strName {##->setType(SAMPLE_CLAUSE);};
strName : STRING;
calc: "CALC" | "calc";

ユーザーが strName として calc/CALC を入力すると、パーサーは Seg Fault をスローします。これを回避する方法がわかりません。

編集:パーサーがセグメンテーション違反を発生させないようにする方法も知りたいです。これにより、望ましくないアプリケーションがクラッシュします。これらの状況では、セグ フォールトではなく正常に終了したいと考えています。

PS: 依存関係があるため、ANTLR 2 のソリューションが必要です。

4

1 に答える 1

0

ここでの通常の解決策は、strNameすべてのキーワードを斜めに変更することです

strName : STRING | calc ;

多数のキーワードがあると仮定して、それぞれをレクサー トークンとして定義し、keywordsルールを作成します。

calc: CALC;
CALC: "Calc" | "calc";
FOO: "foo";
BAR: "bar";

keywords: CALC| FOO | BAR;

strName: STRING | keywords;

一致する場合は、トークンの種類を文字列に変更することもできますkeywords。ANTLR 2 でそれを行う方法を忘れましたが、かなり簡単です。

于 2016-03-31T11:46:14.460 に答える