1 つのソース ファイルで定義された Alex マクロを他のソース ファイルで使用する方法はありますか? 私の場合、 and の定義が$LowerCaseLetter
あります (コード内で特別な役割を持っているため、これらはand$UpperCaseLetter
を除くすべての文字です)。これらのマクロを他のファイルから参照するにはどうすればよいですか?e
O
.x
1 に答える
何かが存在することを反証することは、存在するものを見つけることよりも常に難しいですが、以下の情報は、アレックスが読み取り中の .x ファイルからのみマクロ定義を取得できることを示していると思います (のような事前定義されたものを除く$white
)。ファイル....
次のようにして、Alex のソースコードを取得できます。
> cabal unpack alex
> cd alex-3.1.3
src/Main.hs では、事前定義されたマクロは、最初にinitSetEnv
(charset マクロ$white
、$printable
、および ".") とinitREEnv
(regexp マクロ、何もありません) という変数に設定されます。これは、src/ParseMonad.hs の runP に渡され、定義されたすべてのマクロを含む現在の解析状態を保持するために使用されます。初期状態は渡された値を使用して設定されますが、呼び出された関数newSMac
(またはnewRMac
正規表現マクロ) を使用してマクロを追加できます。
これがマクロを設定できる唯一の方法であるように思われるため、マクロを追加できる唯一の方法がソース .x ファイル内の実際のマクロ定義によるものであることを確認するのは、grep ブックキーピングの問題だけです。当然のことながら、Alex は独自の .x/.y ファイルを .x ソース ファイルの解析 (src/parser.y、src/Scan.x) に再帰的に使用します。数レベルの間接参照ですが、newSMac
呼び出すことができる唯一の方法は src/Scan.x マクロを使用することであることを確認できます。
@smac = \$ @id | \$ \{ @id \}
<0> @smac @ws? \= { smacdef }
いくつかの明白な事前定義されたものを除いて、トークンレベルでは物事は通常非常に単純であるため、とにかくレクサーでの再利用はそれほど典型的ではないと思います(多くの場合、 、 、 、およびいくつかの演算子、記号、および括弧のような単純なトークンSPACE
がWORD
すべてNUMBER
ですが必要です)。複雑さは解析段階で発生しますが、技術的な理由から、パーサー インクルードもそれほど一般的ではありません (html に埋め込まれた javascript のように、ネストによる再利用を可能にする新しいテクノロジについては、スキャナーレス解析を参照してください.... スキャナーレスのためのツールただし、解析はまだかなり原始的です)。