6

私はANTLRに比較的慣れていません。私は非常に簡単な文法を持っています:

start   :
('A' 'B' 'C' '1'
|'A' 'B' 'C' '2' 
|'A' 'B' 'C' '3'
)
;

ルックアヘッドとバックトラッキング (構文述語で機能する) の概念の基本は既に理解できたと思います。したがって、この文法は k=4 または backtrack=true で機能します。しかし、正確な違いは何ですか。主な問題は、いつ何を使用するかです。インターネットで答えを見つけようとしましたが、成功しませんでした。

4

2 に答える 2

3

文法はオプションなしでANTLRv3で機能します。

kオプションは、ANTLRを従来のLL(k)解析に制限します。バックトラックとは、パーサーがどのルールを使用するかを予測できない場合、単に試行し、バックトラックして再試行することを意味します。ANTLRが特定の文法の先読みDFAを構築できない場合に使用する必要があるバックトラッキングオプション。ANTLR v3は、正規表現からDFAを非常に簡単に構築できますが、再帰的なルールには問題があります。たとえば、この文法は機能します。

start: recursive_rule ';'
     | recursive_rule ':'
     ;

recursive_rule : (ID)* '%'
               ;

以下のこの文法は同じですが、再帰によって表現されます。ANTLRはそのためのDFAを構築できないため(実際には理由はわかりません)、バックトラックをオンに切り替える必要があります。

start options {backtrack=true;} : recursive_rule ';'
                                | recursive_rule ':'
                                ;

recursive_rule : ID recursive_rule
               |'%'
               ;

kオプションは、パーサーのパフォーマンスを向上させるために使用されます。LL(*)をLL(k)に制限する他の理由はわかりません。

于 2012-11-16T11:58:27.263 に答える
3

本「The definitve Antlr Reference」で私の質問に対する理論的な説明を見つけました。これも私の理解にとって重要でした。たぶん、同様の質問を自問する他の何人かは、本のこのスニペットも助けるでしょう.

本からの抜粋

262ページ

于 2012-11-19T15:46:35.033 に答える