2017-03-01 1 views
-1

を無視...正規表現は、私は次のようなものを分析するのlexプログラムを構築していた冗長かっこ

function myFunc { 
    if a = b { 
     print "Cool" 
    } 
} 

が、それは最初にすべてのものを選び出すます正規表現を作成するためには、具体的にフレックスを使用して、可能です{}

私は取得する

{ if a = b { print "Cool" } } 

代わりに

{ if a = b { print "Cool" } 

は、現在、私のフレックスファイルに私はこの正規表現 を持っている{[^ \ 0] *}あなたがやろうとしているものと

+1

のように見えますが、中括弧は 'bison'とは何かでなければなりませんが、' flex'ではありません。 – tsh

答えて

0

一つの問題は、正規表現はデフォルトで貪欲であるということである(それを変更するにはいくつかのトリックを行うことができ、しかし、まだ問題があるでしょう)、複数の関数を含むファイルでこれを実行すると、意図した以上に一致します。その理由は、ほとんどのプログラミング言語がチョムスキー階層のType 1 grammarsであるか、文脈依存文法であり、RegExはタイプ2(文脈自由文法)であるためです。後者を使って直接多くの作業をせずに直接解析することは、基本的に不可能です。それについての完全な説明は...長いです。しかし文脈に敏感な文法では、与えられた要素の意味は、入力にどこにあるかによって変わる可能性がありますが、文脈自由文法ではすべての要素がまったく意味を持ちます。あなたのケースでは、}と一致したくない場合は、対応する}を開いて{と一致させたい場合は、それまでに見た{}の数をカウントします。

実際に車輪、耕運機、火災、鉄道、電気まで再発明せずにコードの解析をしたいのであれば、GitHubでAnTLRをチェックアウトすることをお勧めします。 AnTLRを使用すると、解析しようとしている言語の文法(まだ存在しない場合)を作成し、解析されたソースコードをParse Treeの形式で提供することができます。パースツリーは非常に使いやすく、AnTLRにはほとんどすべての言語の文法があり、plugins for several languagesです。

それ以外は、私が使用したオンライン正規表現テスターとサンプルコードのメモ帳++の両方がすべて一致しました。あなたはRegEx {.*}も試してみることができます。

関連する問題