問題タブ [fsyacc]
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.
f# - オプションの構文と繰り返しをOcamlYacc/FsYaccで表す
文法の字句解析/構文解析のスキルを身に付けようとしています。SQL用に作成した単純なパーサーを振り返っていますが、完全に満足しているわけではありません。パーサーを作成するためのより簡単な方法があったはずです。
SQLにはオプションのトークンと繰り返しがたくさんあるので、私はつまずきました。例えば:
と同等です:
ON
and句はオプションであり、WHERE
複数回発生する可能性があります。私はこれらをパーサーで次のように処理しました。
つまり、オプションの構文を個別のルールに分割して処理し、再帰を使用して繰り返しを処理しました。これは機能しますが、解析が小さなサブルーチンの束に分割され、文法が実際に何を表しているかを確認するのは非常に困難です。
角かっこ内にオプションの構文を指定し、*または+で繰り返しを指定できれば、はるかに簡単に記述できると思います。これにより、whereClauseとjoinListのルールが次のようになります。
このフォームははるかに読みやすく、キャプチャしようとしている文法をより直感的に表現していると思います。残念ながら、この表記法または同様のものをサポートするOcamlまたはF#のドキュメントには何も見つかりません。
OcamlYaccまたはFsYaccでオプションまたは反復トークンを使用して文法を表す簡単な方法はありますか?
f# - FSYaccスレッドによって生成されたパーサーは安全ですか?
FSYaccを使用してパーサーを生成した場合、スレッドセーフになりますか?
私が尋ねる唯一の理由は、機能のためです
Parsing.rhs_start_pos
とParsing.symbol_end_pos
それらに状態が渡されていないように見えます。これにより、共有された場所から現在の非終端記号/シンボルを取得していると思いますが、これは正しいですか?
コードを反映した後、静的プロパティから位置を取得していることがわかります
これは正しいです?もしそうなら、私はそれについて何ができますか?
編集:私はまた呼ばれる静的メソッドを見ますset_parse_state
しかし、それでも私の問題は解決しません...
f# - fslex レキシング JavaScript 正規表現
JavaScript の正規表現リテラルを lex しようとしています。これらは "/" で始まり "/" で終わります (場合によっては他の修飾子も)。問題は、それが除算演算子ではなく正規表現であるかどうかを判断する唯一の方法は、「/」文字の前のトークンを読み取ることです。
これについては、こちらでもう少し詳しく読むことができます。
現状では、以前のトークンを取得する方法に関するドキュメントは見つかりません。うまくいけば、これは可能であり、誰かが私にその方法を教えてくれます.
ありがとう。
f# - lex/yacc と fslex/fsyacc の違いは何ですか?
レクサーとパーサーを書きたいので、F# を学んでいます。私はこの種の処理の経験が少しありますが、F# と同様に適切に学習する必要があります。
F# の字句解析機能を学習する場合、lex と yacc を学習すれば十分ですか?
それとも、lex/yacc のコードが fslex と fsyacc で動作しないことを意味する違いはありますか?
f# - F# 2.0 と Powerpack 2.0、fslex エラー 1
名前空間 RSLispV3.RunTime: http://pastebin.com/XNb9qi11
LispParser.fsy: http://pastebin.com/pymF1Vvm
LispLexer.fsl: http://pastebin.com/pfXdDuxs
MSBuild で PowerPacks ターゲットを取得し、.fsprog から呼び出しました。
VS2008 でビルドすると、エラーが発生します: "fslex.exe" exited with code 1.
ヘルプ?
f# - FsLex と FsYacc の異常なエラー
私はこのプロジェクトをコンパイルしようとしています:
しかし、意味のないエラーがたくさん発生します。彼らは私がよく知っているテキストを取得しましたが、その位置にはそのようなものはありません (空の行にある予期しない ')' のように)。
お願い助けて!
.net - 相互に依存し、別々のファイルで定義されるタイプを定義することは可能ですか?
拡張された解析機能を備えたライブラリを実装しようとしています。大学で知っていたので、fsyaccを使うことにしました。残念ながら、次の問題が発生しました。
文法の先頭(Head)のクラスを定義し、その実装を1つのファイルに配置しました。次に、パーサーを次のように定義しました。
Fsyaccは、分離されたモジュール(パーサー)を生成します。成功するには、次の順序でコンパイルする必要があります。Head.fs
Parser.fs
このライブラリを.NETにあるものと同様にするために、静的な解析メソッドをHeadに追加したいと思います。残念ながら、Parserモジュールのメソッドを使用する必要があります。
このような型の依存関係は'および'演算子で解決できることは知っていますが、1つのファイルで定義された型にのみ適用できます。
別々のファイルにある場合でも、相互に依存する型を作成する他の方法はありますか?C / C ++のような宣言/実装分離メカニズムを探していましたが、何も見つかりませんでした。
compiler-construction - Fsyaccの文法例に誤りがありますか?
だから私はF#でコンパイラを書こうとしていて、F#パワーパックに付属しているFslexツールとFsyaccツールを見てきました。私が理解しようとしている外部ビルドツールを処理するサンプルプロジェクトがあります。こちらからダウンロードできます。この例はコンパイルして実行しますが、文法に微妙なエラーがあると思います。微妙な言い方をします。文法は、式を解析するためにDragonの本で見たものと似ており、それを見つける経験がないからです。
入力「4*5+3」は23と正しく評価されました。
ただし、入力4 * 5-3は、解析エラーを生成します。これは、Fsyaccによって生成されたコードのエラーです。
問題をよりよく理解するためにあなたの助けをいただければ幸いです。そうすれば、私はより多くの情報を得て、Fsyaccにもっと自信を持つことができます。以下に*.fsyファイルを投稿しました。
そしてここにASTデータ型の定義があります
編集
エラーを理解するのに役立つように、パーサーを駆動するためのレクサー定義とコードを投稿しました。
最後に、パーサーを駆動するコード。
編集:レクサーのオプションのマイナス記号が問題でした。それを削除した後、サンプルは期待どおりに機能します。
parsing - F#での解析中のエラーの処理方法
F#レクサーとパーサーにfslex/fsyaccユーティリティを使用しています。入力テキストの構文が正しくない場合は、それが発生する場所を知る必要があります。
Lexerで誤った語彙素(トークン)を判別し、誤った記号または単語が使用された場合に例外をスローする可能性があります。
質問はパーサー(fsyacc)に関連しています-入力テキストに正しいトークンがあり、レクサーによって正常にトークン化されたが、解析中にエラーが発生した場合(たとえば、トークンの順序が正しくないか、ルールにトークンがない)
例外が発生した場合、これにより、解析が失敗した位置(行と列)がわかります。
しかし、解析が失敗したASTクラスも特定することは可能ですか(はいの場合-どのように行うのですか?)。
たとえば、私のparser.fsyファイルに次のようなものを書くことは可能ですか?
f# - F# fslex fsyacc は製品コード用に成熟していますか?
fslex/fsyacc、バギー、遅い、愚かなどを実際にリッピングしている 2 年前の Web ページを読んだ後、OCamel の対応するものと比較して、構文解析の必要性をレクシングするための最善の策は何だろうか?
以前は C# バインディングで ANTLR を使用していましたが、現在 F# を学習中であり、パーサー ジェネレーターが付属しているのを見て興奮しました。F# は現在正式にリリースされており、Microsoft が実際にサポートと開発を目指しているようです。fslex と fsyacc は製品コードにとって価値があると思いますか?