問題タブ [alex]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Alex ソースファイルでトークン規則の前に Haskell コードを配置する方法はありますか?
次の動作中のAlexソース ファイルを考えてみましょう。
すべてのルールの前に、ヘルパー コードをファイルの一番上に配置したいと考えています。私はこれをやってみました:
しかし、次のエラーが発生しました:
(11 行目は、ヘルパー コードの後の閉じ中括弧です)
ヘルパー コードをファイルの先頭に近づける方法はありますか?
また、「module Main」宣言とともにヘルパー コードを最初のブロックに配置しようとしましたが、「%wrapper」ビットが、生成されたファイルの最初のものとして正しく表示される必要があるインポート ステートメントを生成するため、うまくいきませんでした。
haskell - HappyでAlexモナディックレクサーを使用するには?
私は Alex + Happy を使用してパーサーを構築することを学ぼうとしています。特にmonad
、Alex のラッパーの使用法を学ぶことに興味があります。私はすでに Alex とHappyのドキュメントを見てきましたが、私にとっては、それらを一緒に使用するための有用な情報が本当に不足しています。basic
私はそれらをとposn
ラッパーと一緒に動作させることができましたが、と途方に暮れていmonad
ます。
私はすでにアレックス、ハッピー、およびモナドレクサーに関する SO に関する別の質問を見てきました (以下を含む:アレックス + ハッピーを使用して単純なインタープリターを構築するためのチュートリアルはありますか?monad
オンラインのコードのほとんどは、カスタム レクサー関数で Happy を使用するか、basic
またはposn
Alex ラッパーを使用します。
以下は、ini に似た構文の単純なレクサーです。
相対的な Happy パーサーは次のとおりです。
多くのコンパイラ エラーが発生します。
パーサーを使用するにはどのように変更すればよいalexMonadScan
ですか? Happyのドキュメントはまったく明確ではなく、明確にする例を使用しないように努めています (または、提供されている例は、私の観点からは明確ではありません)。
必要に応じて、この同じレクサー + パーサーの私のposn
バージョンを投稿できます。
haskell - 別のファイルから Alex マクロを使用する
1 つのソース ファイルで定義された Alex マクロを他のソース ファイルで使用する方法はありますか? 私の場合、 and の定義が$LowerCaseLetter
あります (コード内で特別な役割を持っているため、これらはand$UpperCaseLetter
を除くすべての文字です)。これらのマクロを他のファイルから参照するにはどうすればよいですか?e
O
.x
haskell - Cabal で Alex にコマンドライン オプションを渡す方法
私の現在のプロジェクトには、AlexTokens.x
がコンパイルする必要があるファイルがあります。Tokens.hs
私のファイルでは、セクションに.cabal
リストTokens
し、喜んでファイルを作成します。other-modules
cabal build
ただし、Alex に GHC 最適化バージョンのファイルを作成するように指示する -g オプションを指定せずにこれを行います。このオプションは、GHC で使用するとスキャンが 10 倍高速になり、コンパイルも桁違いに速くなります。
GHC を使用してコンパイルするときに -g オプションを含むように cabal に指示するにはどうすればよいですか?
haskell - アレックス、ハッピー、カバル、再前処理
私は Alex 3.0.5、Happy 1.18.10、Cabal 1.16.0.2 を使用しています。
Cabal を使用して構築された小さなコンパイラ プロジェクトがあります。コンパイラの内部をライブラリとして公開しているので、公開モジュール セクションに MyLangLex と MyLangPar があります。Alex と Happy によって生成された .hs ファイルを削除してから cabal configure を実行すると、cabal build は最初に Alex と Happy を実行し、ファイルを生成してからビルドを続行すると、すべてが期待どおりに機能します。ただし、これらのファイルを削除しないと、Alex と Happy はファイルを作成しないか、適切な場所に配置しません。Happy からのメッセージが表示されるので、Happy が実行されると思います。ただし、生成されるはずの .hs ファイルを見ると、正しくありません (変更されていません)。Cabal がビルドで使用する hs ファイルは、変更されるべき動作が変更されていないため、間違ったファイルです。つまり、.y ファイルへの変更はビルドされたプログラムに組み込まれていないため、Happy が実行されている間、Cabal はこのファイルを一時ディレクトリに置き、古い .hs ファイルを使用していると思われます。建てる。しかし、これについてはよくわかりません。
エラーは私の側にあるのでしょうか、それともツールの 1 つが正しく動作していないのでしょうか?
haskell - Alex lexer のタブ幅を指定するには?
アレックスのドキュメント (第 5 章)は次のように述べています。
入力テキストの行番号と列番号を Alex に追跡させたい場合もあれば、自分で追跡したい場合もあります (たとえば、標準の 8 列とは異なるタブ幅を使用するなど)。
しかし、アレックス ポジション トラッカーでタブの幅を 8 から 4 に変更するのは、簡単ではなく難しいものです。このコードは、Alex が生成したルーチンの奥深くに隠されています。
haskell - Haskell Alex: basic-bytestring lexer がメモリリークする
入力内のすべての単語を出力する単純なレクサーを作成しようとしています。ここで、単語は文字の最大シーケンスですa-zA-Z
。他のすべての文字は無視する必要があります。
ラッパーを使用するこのための私のAlexプログラムbasic-bytestring
は、入力のサイズと同じくらい多くのメモリを使用します。私はそれが一定のメモリで実行されることを期待していたでしょう。
を使用したヒープ プロファイル-hc
は、ピン留めされたメモリの 1 つのブロックが急速に入力のサイズに増加し、その後ゆっくりと 0 に減少していることを示しています。
興味深いことに、basic
ラッパーと通常の文字列を使用すると、定数メモリのみが使用されます。
アレックスの入力ファイルは
サイズ 10M の入力で実行すると、出力は次のようになります+RTS -s
。
どこが間違っているか、またはこの問題をさらに調査する方法について助けていただければ幸いです。