2017-08-21 7 views
0

私自身の文法では、antlr4 c grammarをインスピレーションとして使用しています。私は実際には得られない1つのことを思い付いた。データ型が使用されていないときにLexerの規則がそこにあるのはなぜですか?たとえば、規則Double : 'double';は使用されませんが、パーサー規則typeSpecifier:('double' | ...);(簡略化のために他のデータ型は削除されています)がいくつかの場所で使用されています。パーサールールtypeSpecifierがレクサールールDoubleを使用していない理由はありますか?antlr4 c文法パーサールール "typeSpecifier"がレクサールール "Double"を使用していないのはなぜですか?

答えて

1

このページのすべての文章はボランティアの投稿であり、ANTLR4の一部ではありません。それは明らかに間違いですが、レクサーのルールがマッチする方法は、レクシングに違いはありません。あなたがメソッドを混在しても、無悪影響のいずれかの方法で

typeSpecifier 
    : ('void' 
    | 'char' 
    | 'short' 
    | 'int' 
    | 'long' 
    | 'float' 
    | 'double' 

Double : 'double'; 

または暗黙的な1:あなたは、明示的なルールのいずれかを実装することを選択することができます。実際、文法全体をよりグローバルに見れば、著者は、例えばRegisterのような他の多くのレクサー規則で同じことをしました。実際の練習に違いはありません。

ボトムライン?好きな方法を選んで一貫して適用してください。私の個人的な好みは簡潔になっているので、暗黙のトークンは、文法の1か所だけで使用されている限り好きです。トークンが2つの場所で使用されるとすぐに、トークンを明示的に作成し、使用されている2つ以上の場所を更新することをお勧めします。

+0

説明をありがとう! – Michael

関連する問題