問題タブ [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.mly
andを書きました。Aは、とで囲まれたステートメントのブロックです。lexer_sub.mll
subroutine
subroutine
Sub
End Sub
実際、私が処理したい生ファイルには、サブルーチンのリストといくつかの役に立たないテキストが含まれています。次に例を示します。
したがって、すべてのコメント (たとえば、など) を無視して を呼び出し、サブルーチンのリストを返すことで、このファイルを解析できるparser.mly
andを記述する必要があります。lexer.mll
haha
' hehe
parser_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_statement
of に縮小されdata_manipulation_statement
ます。a(3).value
に縮小されmember_access_expression
ます。a(3)
に縮小されindex_expression
ます。となり、3
に減少しargument_list
ます。
文が解析できない場合、文の先頭を of に縮めようとしているようでcall_statement
、control_statement
エラーで終了します。
私は常に、優先順位がどうであれ、構文解析は常にリダクションを拒否し、成功して終了することはできないと考えていました。しかし、それは試みて失敗し、他の可能性を試みることを拒否したようです...
誰かが明確にするのを助けることができますか?
parsing - 2 番目のルールが失敗した場合は、最初のルールを試す
の排他的サブセットであるIDENTIFIER_ONE
2つの識別子のセットを定義しました。次のようなパーサーを書きたいと思います。IDENTIFIER_TWO
IDENTIFIER
どこでi1
(resp., ) は( resp., i2
) に属します。に属します。以下は、私が求めているすべてのポイントをすでに実現しています。IDENTIFIER_ONE
IDENTIFIER_TWO
arg
value
IDENTIFIER
parser.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.mly
callを呼び出しますparser_pd.main
。したがって、parser_pd.mly
次のようになります。
以前のコンテンツのほとんどはparser.mly
に移動する必要があるためparser_pd.mly
、parser.mly
以前よりもはるかに軽くなり、次のようになります。
??????
問題は、その部分の書き方がわからないことであり、lexer.mll
どちらが軽くなければならないかということです ( token END
、SUB
andのみを読み取り、EOS
によって処理されるコンテンツを許可するためlexer_pd.mll
)。おそらく、Lexing
モジュールのいくつかの機能が必要ですか?
私の質問が明確であることを願っています...誰か助けてくれますか?
parsing - トークンを含むテーブルを .mly と .mll の両方で見えるようにする
keyword_table
いくつかの文字列をいくつかのトークンにマップする を定義したいと思います。また、このテーブルを と の両方parser.mly
で表示できるようにしたいと考えていますlexer.mll
。
でテーブルを定義する必要があるようですparser.mly
。
lexer.mll
ただし、たとえば、では使用できませんでした
誰が問題がどこにあるのか教えてもらえますか? parser.mly
と の両方でデータを可視化することはできませんlexer.mll
か?