问题标签 [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.

0 投票
1 回答
373 浏览

parsing - 通过打印有用信息来调试解析器

我想解析一组表达式,例如:X[3], X[-3], XY[-2],X[4]Y[2]等。

在我的parser.mly, index(里面[])定义如下:

tokenINTEGERMINUS在词法分析器中正常定义。

我尝试解析一个例子,它失败了。但是,如果我评论| MINUS INTEGER { 0 - $2 },它运作良好。所以问题肯定与此有关。为了调试,我想获得更多信息,换句话说,我想知道什么被认为是MINUS INTEGER. 我试图添加打印:

但是解析时没有打印任何内容。

谁能告诉我如何打印信息或调试它?

0 投票
2 回答
130 浏览

parsing - 解析一组表达式时发生冲突

我想解析一组表达式:R[3]C, R[2]C, R[3]C-R[2]C... 有一个我无法解决的冲突...

这是一部分lexer.mll

的一部分parser.mly

奇怪的是,这段代码不起作用R[3]C-R[2]C,这里是parser.conflicts,我无法真正理解。

如果我注释行| R LBRACKET r = index RBRACKET C c = index ...中的行e_cell,代码可以解析R[3]C-R[2]C,where 3and 2are index`R[3]Cand R[2]Care e_cell,and R[3]C-R[2]Cis e_expression

有人可以帮忙吗?

0 投票
2 回答
97 浏览

parsing - 解析子程序列表

我已经写了parser_sub.mlylexer_sub.mll它可以解析一个subroutine. A是由andsubroutine包围的语句块。SubEnd Sub

实际上,我要处理的原始文件包含一个子程序列表和一些无用的文本。这是一个例子:

所以我需要编写parser.mlyand lexer.mllwhich 可以通过忽略所有注释(例如haha' hehe等)和调用来解析这个文件parser_sub.main,并返回一个子例程列表。

  1. 谁能告诉我如何让解析器忽略所有无用的句子( a Suband之外的句子End Sub)?

    这是parser.mly我试图写的一部分:

    /li>
  2. for 的规则和解析procedure_body很复杂,实际上是在parser_sub.mlyand中定义的lexer_sub.mll,那么我怎么能允许parser.mly并且lexer.mll不重复定义它,而只是调用parser_sub.main呢?

0 投票
1 回答
183 浏览

parsing - 解析中包含 2 个方向(字符串 <-> 标记)的表

我已经定义了一个哈希表keyword_table来存储我的语言的所有关键字。以下是部分代码:

由于关键字很多,我真的很想尽可能避免重复代码。

parser.mly中,似乎%token CALL CASE ...无法简化,因为必须明确定义每个标记。但是,就reserved_identifier部分而言,是否可以调用函数从令牌返回字符串,而不是对每个字符串进行硬编码?

因此,这可能表明哈希表不适合此目的。哪种数据结构是双方搜索的最佳选择(我们假设双方的每个键都是唯一的)?因此,我们要实现find_0 table "Call"returns token CALL(用于lexer.mll)和find_1 table CALLreturns "Call"(用于parser.mly)。

另外,如果table可以定义,我应该把它放在哪里以便parser.mly可以使用它?

0 投票
1 回答
116 浏览

parsing - 解析中的异常处理

我正在编写一个分析许多独立文件的分析器。所有文件都具有相同的结构:它有一个Initiation(), 后跟几个过程。例如:

启动一切,然后每个程序的Initiation()分析是独立的。在分析它们之前,我需要对它们进行解析。

main.mllet procedures = Parser.main Lexer.token buf用来调用解析。如果一切顺利,procedures包含过程的抽象语法树:Initiation()、、procedure1()等。

但是,在当前阶段,如果在解析过程时解析引发错误,它会返回 a Parser.Error,并停止解析整个文件。结果,无法解析麻烦程序之后的程序。

我想做的是在某处进行错误处理,以便let procedures = Parser.main Lexer.token buf始终成功,即使在程序的一部分内部无法解析(在这种情况下,它的值可以是UnparseableProcedure,而不是抽象语法树)。

目的实际上是为每个文件解析尽可能多的程序,然后尽可能多地分析它们......

有谁知道该怎么做?

0 投票
1 回答
235 浏览

parsing - 解析中的优先级

我重新表述了我之前提出的一个问题。目的是了解优先级在解析中的工作原理。

我想解析一个语句a(3).value = 100parser.mly如下在读取后停止.,并返回错误。

但是,如果我将专用于argument_list(en-globed by beginand end) 的部分移动到文件的末尾(因此它位于 之后l_expression),则解析效果很好。

在语句被解析的情况下,它被简化为 a let_statementof data_manipulation_statement; a(3).value减少到member_access_expression; a(3)被简化为index_expression; 并3减少到argument_list

在无法解析语句的情况下,它似乎试图将语句的开头减少为 a call_statementof control_statement... 它以错误结束。

我一直认为,无论优先级是什么,解析总是拒绝那些不能以成功结束的归约。但那里似乎尝试过又失败了,拒绝尝试其他可能性……

谁能帮忙澄清一下?

0 投票
1 回答
97 浏览

parsing - 解析两种语句,具有优先级

我想同时解析f(arg).method和;第一个比后者具有更高的优先级。f(arg)block_statement

parser.mlycan't parse中的以下元素f(arg),但可以解析f(arg).method如下:

(* parser.mly: *)

但是如果我们为 追加另一行| IDENTIFIER LPAREN expression RPAREN { BS_I_E ($1, $3) }block_statement这一次它可以解析f(arg)如下:

但是,这一次,f(arg).method不能再解析了。读取后会引发错误.

f(arg).method如果可能的话,我不知道如何让解析器进一步阅读。我真的需要解析器来解析这两个语句......有人可以帮忙吗?

0 投票
1 回答
66 浏览

parsing - 如果第二条规则失败,请尝试第一条规则

我已经定义了两组标识符IDENTIFIER_ONEIDENTIFIER_TWO它们都是IDENTIFIER. 我想写一个解析器,这样:

其中i1(resp., i2) 属于IDENTIFIER_ONE(resp., 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),它就会进入 的第二条规则block_statement_EOS,之后EQUAL就无法解析了。

block_statement_EOS理想情况下,如果第二条规则失败,我希望解析器可以尝试第一条规则。谁能帮助我使这成为可能?

PS:如果我写parser.mly如下,所有的目标都可以实现。有谁知道为什么?另外我真的不喜欢这种解决方法,因为我确实需要identifier在许多其他规则中编写而不是两个子集,我希望有一个更优雅的解决方案......

0 投票
1 回答
102 浏览

parsing - 通过制作单独的 .mly 和 .mll 来检索解析的一部分

我正在编写一个前端来解析一组txt文件,每个文件包含一组procedures,例如一个 txt 文件看起来像:

syntax.ml包含:

parser.mly好像:

现在,我想检索procedure_declaration(出于异常处理目的)的解析。这意味着,我想创建parser_pd.mlyand lexer_pd.mll,并让parser.mlycall parser_pd.main。因此,parser_pd.mly看起来像:

由于之前的大部分内容parser.mly都应该移到parser_pd.mly中,parser.mly现在应该比以前轻得多,看起来像:

问题是我不知道如何编写该??????部分,lexer.mll哪个应该很轻(因为它只读取 token和END,并让内容由 处理)。也许一些功能来自SUBEOSlexer_pd.mllLexing需要模块中的一些功能?

希望我的问题很清楚......有人可以帮忙吗?

0 投票
2 回答
105 浏览

parsing - Make a table containing tokens visible for both .mly an .mll

I would like to define a keyword_table which maps some strings to some tokens, and I would like to make this table visible for both parser.mly and lexer.mll.

It seems that the table has to be defined in parser.mly,

However, I could NOT use it in lexer.mll, for instance

Could anyone tell me where is the problem? Isn't it possible to make a data visible for both parser.mly and lexer.mll?