2011-08-18 5 views
5

あなたが言語のEBNFの説明を見ると、あなたは多くの場合、整数や実数の定義を参照してください。番号の認識は、スキャナまたはパーサーに属していますか?

integer ::= digit digit* // Accepts numbers with a 0 prefix 
real  ::= integer "." integer (('e'|'E') integer)? 

(定義は、その場で行われた、私はおそらくそれらにミスを犯しています)。

文脈自由文法に現れますが、字句解析段階では数字がよく認識されます。より完全なものにするためにそれらは言語定義に含まれていますか?また、実際にスキャナに置くべきであることを実現するのは実装者次第ですか?

答えて

3

ANTLR、Lex/YACCなどの多くの一般的なパーサー生成ツールは、2つの段階に分かれています。まず、入力文字列がトークン化されます。次に、トークンを組み合わせて具体的な構文ツリーを作成します。

しかし、トークン化を必要としない別の方法があります:バックトラッキングをチェックアウトrecursive-descent parsers。このようなパーサーの場合、トークンは非トークンと同様の方法で定義されます。 pyparsingは、そのようなパーサーのパーサジェネレータです。

2ステップの手法の利点は、通常、トークンを使用すると、文字列の操作、文字列の検索、およびバックトラックが大幅に少なくなり、パーサーの効率が向上することです。 「決定的ANTLRリファレンス」(テレンス・パー)によれば

[レクサーとパーサー]との間の唯一の違いは、レクサーの構造を認識しながら、パーサはトークンのストリーム内の文法的構造を認識することです文字の流れ

1

正確には文法の構文が完全である必要があります。したがって、識別子の正確な形式と演算子のスペルに関する詳細も含まれています。

はい、コンパイラエンジニアが決定しますが、一般的にはかなりわかります。レクサーはすべての文字レベルの詳細を効率的に処理する必要があります。

もっと答えがありますIs it a Lexer's Job to Parse Numbers and Strings?

関連する問題