問題タブ [fslex]
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.
parsing - fsyacc パーサーにパラメーターを渡すことはできますか?
パラメータをレクサーに渡すことができることを知っています:
しかし、同様の方法でパーサー開始シンボルを定義することはできません。
私はそれを次のように定義しようとしました:(この質問のおかげで)
しかし、このようにすべての非終端記号を定義する必要があり、それらはすべてラムダを返します。scope
これは私が達成しようとしているものではありませんが、いくつかの非端末内でパラメーターにアクセスし、解析中にそれらのアクションを実行できるようにしたいと考えています。
のみを含むIParseStateタイプに があることに気付きましたParserLocalStore
(デバッグによってのみチェックされます)。私はすべての非ターミナルからアクセスできるので、そこにパラメータを保存できますか、それとも悪い考えでしょうか?LexBuffer
parseState
パーサーの head セクションで変更可能な変数を使用することを考えましたが、それらは静的であり (私が思うに?)、複数の入力を同時に解析することはできません...
編集:
scope
現在、特定のトークンにパラメーターを保存します。
レキサーは、トークンをscope
作成するときに関連するトークンにそれを埋め込みます... 私はこの解決策が本当に好きではありませんが、まだより良いものを思いつくことができませんでした.
macos - Mac で F# PowerPack 2.0.0.0 から fslex.exe を実行するには?
Mac で F# PowerPack 2.0.0.0 から FsLex を実行できません。プログラムを単純に実行すると、次のように表示されます。
私が従った手順は次のとおりです。
- MDK 3.0.2 をインストールします。
- 2010 年 5 月 20 日にリリースされた F# PowerPack 2.0.0.0
sudo gacutil -i
を各 DLL にダウンロードします。sudo cp -r FSharpPowerPack-2.0.0.0 /Library/Frameworks/Mono.framework/Versions/3.0.2/lib/mono
- F# 2.0.0.0 の 2011 年 4 月の CTP をhttp://www.microsoft.com/en-us/download/details.aspx?id=11100からダウンロードし、スクリプトを使用し
install-mono.sh
ます。
エラーの意味と修正方法を教えてください。
f# - 1 つの fslex ルール パターンに対して複数のトークンを返す方法は?
fslexを使用して、1 つのパターンに対して複数のトークンを返したいのですが、それを実現する方法がわかりません。複数のトークンを返す別のルール関数を使用してもうまくいきます。
私はこのようなものを使用しようとしています:
ここで解決しようとしている問題は、が と の間にoperations
ある場合にのみ、事前定義されたトークン (マップを参照)と照合することです。それ以外の場合、一致は として返されます。identifier
.
(
ID
私は fslex にかなり慣れていないので、正しい方向への指針を喜んでいます。
f# - F#整数ファイルディレクティブ
私はfslexとfsyaccを使用してきましたが、F#ソースファイル(.fs
レクサー(.fsl
)とパーサー(.fsp
)のルールから生成されます)は、このようなステートメントであらゆる場所で元.fsl
の(場合によっては同じソースファイルを参照します).fs
番号は行番号です):
また、.fs
によって生成されたファイルpars.fsp
も同じようなことをしますが、それと一緒に生成されたF#署名ファイル(.fsi
)への参照が追加されます。これはどういう意味ですか?
f# - FsLex ルールを末尾再帰にする方法 / StackOverflowExceptions を防ぐ方法
fslex / fsyacc を使用してスクリプト言語を実装していますが、大規模なユーザー入力 (1,000 以上のスクリプト) に問題があります。特に、このエラーは、レクサーが非常に大きな文字列を分析するときに発生します。
カスタム レクサー関数で文字列をスキャンします (ユーザーがバックスラッシュで引用符などの文字をエスケープできるようにするため)。関数は次のとおりです。
この関数はさまざまな文字を解釈し、再帰的に自分自身を呼び出します。または、閉じ引用符を読み取ると、読み取った文字列を返します。入力が大きすぎる場合、 orルールで aStackOverflowException
がスローされます。_
(whitespace | ...
生成さLexer.fs
れたにはこれが含まれます:
したがって、実際のルールはになり_fslex_myText
、myText
internal でそれを呼び出します_fslex_state
。
これが問題だと思います。myText
相互に呼び出す2つの関数に変換されるため、末尾再帰ではなく、ある時点でStackOverflowException
.
だから私の質問は本当にです:
1)私の仮定は正しいですか?または、F# コンパイラは、末尾再帰関数と同様にこれら 2 つの関数を最適化し、再帰呼び出しの代わりに while ループを生成できますか? (関数型プログラミングは私にとってまだ新しいものです)
2)関数を末尾再帰にする/防止するにはどうすればよいStackOverflowException
ですか?FsLex のドキュメントはそれほど広範ではなく、公式の F# コンパイラが異なる点を理解できませんでした。明らかに、大きな文字列には問題はありませんが、その文字列ルールも再帰的に呼び出すため、ここで途方に暮れています: /
f# - fslex - 2 つのトークン セットを切り替えるには?
fslex
andを使用して小さな DSL パーサーを作成しようとしていfsyacc
ます。入力は、異なる字句規則を必要とする 2 つの異なる言語のチャンクをインターリーブすることで構成されます。fslex
それをサポートするためにファイルを作成するにはどうすればよいですか?
(同様のケースは、c 言語用のファイルを定義する方法であると思いfslex
ますが、インライン アセンブリをサポートしており、異なる字句規則が必要ですか?)
私が現在持っているものは次のようなものです:
問題は、トークンがcore
パーサーによって返されると、代わりに入力の次の部分が渡されるtokenize
ことです。しかし、私は(いわば)その状態にとどまりたいと思っています。core
それ、どうやったら出来るの?
ありがとう!
f# - fslex 学習: レクサーが進んでいません
私は現在、単純な計算の解析に基づいて (F# ツールセットに基づいて) 字句解析と解析について学んでおり、字句解析器が文字列全体を消費するように進んでいないことに行き詰まっています。
ここで注意してください。たとえば、'test lexbuf'
提供する文字列全体が確実に消費されるようにするために、最後に記述する必要があります。
実際の実装ではそれを行わないため、たとえば最初の数字を読み取るだけで、それがすべて取得できます。
よく似た構造の例をたくさん見てきました。何が欠けていますか。
parsing - F# lex/yacc パーサーで「マイナス」演算子と負数を区別する
FsLex と FsYacc を使用して単純なスクリプト言語を解析しようとしていますが、マイナス演算子と負の数値を区別するのに問題があります。
「1 - 2」という用語を評価すると、パーサーは目的の AST: を返しますMinus(NumberLiteral(1.0),NumberLiteral(2.0))
。しかし、「1-2」という用語を評価すると、レクサーは数値 1 を生成し、その後に数値 -2 が続きますが、これは有効な入力ではありません。
問題を再現するための最小限のプログラムを作成しました。Ast は次のように定義されます。
レクサーコードは次のようになります。
パーサーは次のようになります。
私が最初に考えた-
のは、レキサーで as を数値の一部として処理せず、パーサーにMINUS
トークンの結果がマイナス演算子になるかマイナス数値になるかを判断させることでした。残念ながら、空白が消費されるため、入力 "- 2" が負の数として評価されることにもなります。
しかし、これは共通の問題であり、共通の解決策が存在するに違いないと思います。では、これをどのように処理するのが最善でしょうか?
f# - FsLexYacc : Tests/MiniProject ".fsproj のインポートが正しくありません"
githubでは、FsLexYaccプロジェクトにtest dir があります。最も単純なもの (「LexAndYaccMiniProject」) をセットアップしようとします。
次の手順に従います。
1/ 「LexAndYaccMiniProject」という名前の F# コンソール アプリを作成します。
2/ パッケージをインストールします ( VS 2013 コミュニティの「 PM > Install-Package FsLexYacc」は正常に実行されますが、プロジェクト ディレクトリの下のパッケージ ディレクトリにファイルを作成するだけです)。
3/ 解決策を閉じる
4/ すべてのファイル ( Lexer.fsl、Parser.fsy、Program.fs、LexAndYaccMiniProject.fsproj、App.config ) を github からローカル プロジェクト ディレクトリにコピーします。
5/解決策を開く --> 「bin\Debug\FsLexYacc.targets」ファイルが存在しないというエラー メッセージ。
FsLexYaccメイン ページのインストール手順から、以下を含む .fsproj へのリンクを取得します。
これは別のプロジェクト ( TestProjectUsingNugetPackage )に関連しており、既にコピーしたプロジェクト (「LexAndYaccMiniProject」)を参照している上記の「例」セクションにあるリンクとは異なります。
明らかに、FsLexYacc のメイン ページのインストール手順セクションでは、最近 github でホストされている 2 つの異なるプロジェクトへのリンクが参照されています。
質問: 不足している手順は何ですか? 次に何を確認すればよいですか?