2011-09-11 3 views
1

私が使用している正規表現は、flexでプリプロセッサを実装するためのものです。 このプリプロセッサはとてもシンプルです。 それは、次の規則に従う:プリプロセッサディレクティブは大文字で識別子が続きます。#define "#"で始まり#defineではないすべてのテキストの正規表現

  • で始まる

    1. プリプロセッサ識別子のユースケースは、#記号で始まります。例えば

    :私がやった

    #define CONSTANT 100 
    //... 
    int x = #CONSTANT; 
    

    ので、まず最初に、文字列が 'D' が続くか 'が続いていない '#' で始まる

    #define { 
          //store the identifier following #define in a lookup table 
          //do the relevant error checking 
         } 
    NO_POUND_DEFINE { 
            //The string should begin with a '#' sign but not with `#define` 
            //check if the string following '#' is upper case or not 
            //if in upper case do the lookup otherwise throw an error 
           } 
    
  • +1

    どのような言語ですか? #defineにマッチする '#define'はどうでしょうか? – NullUserException

    答えて

    1

    ^#([^d]|d[^e]|de[^f]|def[^i]|defi[^n]|defin[^e]).*ましたd 'に続けて' e 'などは表示されません。

    +0

    これは私が正規表現で動作することがわかる唯一の方法でした。 lexバージョン2.5.4のおかげで –

    2
    var regexp = /^((?!#define).)*$/; 
    

    多分あなたは一見を見たいと思いますこれは:regular-expression-to-match-string-not-containing-a-word

    +0

    に感謝します。それは認識できないルールです。 –

    +0

    Lexは明らかにパフォーマンス上の理由から、Perlのrexexesを好まないでしょう;-) – Joey

    +0

    Joey LexはDFAを使用しています。 – tchrist

    関連する問題