正規表現なしの字句解析


9

私はさまざまな上位レベルの言語(とりわけPythonPHPJavascript)でいくつかのレクサーを調べてきましたが、それらはすべて何らかの形で正規表現を使用しているようです。正規表現がおそらくこれを行うための最良の方法であると確信していますが、正規表現なしで基本的な字句解析を達成する方法、おそらく何らかの直接文字列解析などがあるのか​​と思っていました。

ですから、どのような形でも正規表現を使用せずに、高水準言語*である種の基本的な字句解析を実装することは可能ですか?

* Perl / PHP / Python / Javascriptなどの高レベル言語。Cでそれを行う方法は確かにあります


2
「それらのギリシャ文字と奇妙な波状のものをすべて使用しない微積分に関する本はありますか?」
ケビンクライン

@kevincline完全に良い飛行機が空にあるのに、なぜ人々は大西洋を横切るのでしょうか?
12

1
ローイングとライディングには異なる副作用があります。
ケビンクライン

回答:


3

まず第一に、あなたの「高水準」言語が発明される前から、Cのための正規表現ライブラリーがありました。ただ言ってみれば、Cプログラムは一部の人が考えているようにポダンクではありません。

ほとんどの文法では、字句解析は空白と()[] {}のような他のいくつかの文字を検索する問題です。単語を分割し、キーワードのリストと照合して、一致するものがあるかどうかを確認します。


1
Cが正規表現を実行できないと言ったのではなく、Cがこの種のものを実行するためのより強力な機能を備えていることを意味しました。高級言語よりも高度で高性能なレクサーをCで作成する方が簡単だと思います。
スマッジ

1
@samレクサーまたはパーサーの複雑さとパフォーマンスは、パーサーが実装されている言語よりも、解析される言語の複雑さの関数であるので、違います。
jk。

+1。レクサーは信じられないほど単純です。必要なのは、文字列、トークンのデータ型、および事前定義されたキーワードのテーブルだけです。最もトリッキーな部分は空白とコメントを処理することです:P
メイソンウィーラー

2

個別のトークン化ステップがない「スキャナーレスパーサー」に興味があるかもしれません。スキャナーレスパーサーの利点の説明の1つは、このペーパーの冒頭にあります。スキャナーレス一般化LRパーサーの曖昧性除去フィルター。(ただし、デメリットもあります。)

(他の回答で言及されているPEGは、スキャナーレスパーサーの構築にも使用できます。)


1

正規表現については特に何もありません。これらは単にコードを生成することを可能にする簡単なものであり、実装は一般的に出荷されます。ただし、基本的に、レクサーはFSMであり、正規表現はその目標を達成するための1つの方法にすぎません。


0

もちろん、他のパーサーを使用することもできます。これは、すべての通常の言語もコンテキストフリーであるためです。問題は、なぜあなたがしたいのかということです。

正規表現ほど簡単なものはありません(どのようにO(N)を改善できますか?)。単純化しようとしても役に立たない。Jettiが指摘したように、いつでも簡単なバックトラックを使用できますが、可能な限り回避することをお勧めします。

字句解析により高度なパーサーを使用する場合、字句解析フェーズはまったく必要ない可能性があります。実際、字句解析フェーズがある理由は、文字を解析するよりも字句解析されたトークンを解析する方が速く、解析ステップが大幅に簡素化されるためです。したがって、より高度なパーサーを使用することで、そもそも字句解析のすべての利点を失うだけです。


では、正規表現はそれをどのように行うのですか?(少なくとも字句解析で使用されるほとんどのパターンでは)文字ごとに移動する必要はありませんか?
Jetti、2012

@ジェティはい、もちろん。
Pubby

トークンを引き出す必要がある場合は、各文字を読み取ってバックトラックするのも同じくらい簡単です。コードは増えますが、難しくはありません。
ジェティ

@Jetti素朴なバックトラックがいかに優れているかがわかりません。
Pubby

私はよく言ったことはありません。しかし、OPは他の方法があるかどうかを尋ね、それは高度なパーサーではない別の方法です。
ジェッティ

0

正規表現を使用して字句解析を実行するか、このパスをまったくスキップして、PEGまたはGLRを使用してはるかに柔軟で強力な字句解析を行うことは理にかなっています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.