問題タブ [ocamlyacc]
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 - 有用な情報を出力してパーサーをデバッグする
、、、、などの一連の式X[3]を解析したいと思います。X[-3]XY[-2]X[4]Y[2]
myparser.mlyでは、index( の内部にあります[]) は次のように定義されています。
tokenなどはINTEGER、MINUS通常どおり lexer で定義されます。
例を解析しようとしましたが、失敗しました。ただし、コメント| MINUS INTEGER { 0 - $2 }するとうまくいきます。したがって、問題は確かにそれに関連しています。デバッグするには、より多くの情報を取得したい、つまり、 と見なされるものを知りたいですMINUS INTEGER。印刷を追加しようとしました:
ただし、解析中には何も出力されません。
情報を出力したりデバッグしたりする方法を教えてもらえますか?
parsing - サブルーチンのリストを解析する
を解析できるparser_sub.mlyandを書きました。Aは、とで囲まれたステートメントのブロックです。lexer_sub.mllsubroutinesubroutineSubEnd Sub
実際、私が処理したい生ファイルには、サブルーチンのリストといくつかの役に立たないテキストが含まれています。次に例を示します。
したがって、すべてのコメント (たとえば、など) を無視して を呼び出し、サブルーチンのリストを返すことで、このファイルを解析できるparser.mlyandを記述する必要があります。lexer.mllhaha' heheparser_sub.main
Subパーサーが役に立たない文 ( aと以外の文) をすべて無視する方法を誰か教えてもらえますEnd Subか?ここに
/li>parser.mly私が書いてみた部分があります:のルールと解析
procedure_bodyは複雑で、実際には と で定義さparser_sub.mlyれlexer_sub.mllてparser.mlyいlexer.mllますparser_sub.main。
parsing - 解析時の例外処理
多くの独立したファイルを分析するアナライザーを書いています。すべてのファイルの構造は同じです。ファイルには がありInitiation()、その後にいくつかの手順が続きます。例えば:
がすべてを開始し、各手順のInitiation()分析は独立しています。それらを分析する前に、それらを分析する理由が必要です。
main.ml私は解析を呼び出すために使用しlet procedures = Parser.main Lexer.token bufます。すべてがうまくいけばprocedures、プロシージャの抽象構文ツリーが含まれます: Initiation()、procedure1()など。
ただし、現在の段階では、プロシージャの解析中に解析でエラーが発生した場合、 が返さParser.Errorれ、ファイル全体の解析が停止します。その結果、問題のある手順の後の手順を解析できません。
私がやりたいのは、エラー処理をどこかに置くことです。これlet procedures = Parser.main Lexer.token bufにより、プロシージャの一部の内部を解析できなくても、常に成功します (その場合、その値はUnparseableProcedure、抽象構文ツリーの代わりに , にすることができます)。
目的は、実際には各ファイルのできるだけ多くの手順を解析し、それらをできるだけ多く分析することです...
誰もそれを行う方法を知っていますか?
parsing - 解析の優先順位
私は以前に尋ねた質問を再定式化します。目的は、構文解析で優先順位がどのように機能するかを理解することです。
ステートメントを解析したいと思いa(3).value = 100ます。parser.mly次のようにすると、 の読み取り後に停止し.、エラーが返されます。
ただし、専用の部分argument_list( と で囲まれbeginてendいる) をファイルの最後 (つまり の後l_expression) に移動すると、解析はうまく機能します。
ステートメントが解析される場合、それはlet_statementof に縮小されdata_manipulation_statementます。a(3).valueに縮小されmember_access_expressionます。a(3)に縮小されindex_expressionます。となり、3に減少しargument_listます。
文が解析できない場合、文の先頭を of に縮めようとしているようでcall_statement、control_statementエラーで終了します。
私は常に、優先順位がどうであれ、構文解析は常にリダクションを拒否し、成功して終了することはできないと考えていました。しかし、それは試みて失敗し、他の可能性を試みることを拒否したようです...
誰かが明確にするのを助けることができますか?
parsing - 2 番目のルールが失敗した場合は、最初のルールを試す
の排他的サブセットであるIDENTIFIER_ONE2つの識別子のセットを定義しました。次のようなパーサーを書きたいと思います。IDENTIFIER_TWOIDENTIFIER
どこでi1(resp., ) は( resp., i2) に属します。に属します。以下は、私が求めているすべてのポイントをすでに実現しています。IDENTIFIER_ONEIDENTIFIER_TWOargvalueIDENTIFIERparser.mly(4)
入力として与えられるi1(arg) = value EOSと、目標として(3)正しく読み取られBSE_Let (i1, arg, value)ます。ただし、i2(arg) = value EOS入力として与えられると、読み取り後に解析が停止しますEQUAL。i2(arg)解析が を満たすと、 の 2 番目のルールに進みblock_statement_EOS、後でEQUAL解析できないためだと思います。
理想的には、2 番目のルールが失敗した場合、パーサーが 1 番目のルールを試行できることを願っていblock_statement_EOSます。これを可能にするために誰か助けてもらえますか?
PS : 次のように記述すればparser.mly、すべての目標を達成できます。誰かが理由を知っていますか?さらに、他の多くのルールでは 2 つのサブセットの代わりに記述する必要があるため、この回避策は本当に好きではありませんidentifier。よりエレガントなソリューションを期待しています...
parsing - .mly と .mll を分けてパースの一部を取り出す
ファイルのセットを解析するフロントエンドをtxt作成しています。各ファイルには一連の が含まれていproceduresます。たとえば、1 つの txt ファイルは次のようになります。
syntax.ml内容:
parser.mly次のようになります。
procedure_declarationここで、 (例外処理の目的で)の解析を取得したいと思います。つまり、 and を作成parser_pd.mlyしlexer_pd.mll、parser.mlycallを呼び出しますparser_pd.main。したがって、parser_pd.mly次のようになります。
以前のコンテンツのほとんどはparser.mlyに移動する必要があるためparser_pd.mly、parser.mly以前よりもはるかに軽くなり、次のようになります。
??????問題は、その部分の書き方がわからないことであり、lexer.mllどちらが軽くなければならないかということです ( token END、SUBandのみを読み取り、EOSによって処理されるコンテンツを許可するためlexer_pd.mll)。おそらく、Lexingモジュールのいくつかの機能が必要ですか?
私の質問が明確であることを願っています...誰か助けてくれますか?
parsing - トークンを含むテーブルを .mly と .mll の両方で見えるようにする
keyword_tableいくつかの文字列をいくつかのトークンにマップする を定義したいと思います。また、このテーブルを と の両方parser.mlyで表示できるようにしたいと考えていますlexer.mll。
でテーブルを定義する必要があるようですparser.mly。
lexer.mllただし、たとえば、では使用できませんでした
誰が問題がどこにあるのか教えてもらえますか? parser.mlyと の両方でデータを可視化することはできませんlexer.mllか?