问题标签 [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]
等。
在我的parser.mly
, index
(里面[]
)定义如下:
tokenINTEGER
等MINUS
在词法分析器中正常定义。
我尝试解析一个例子,它失败了。但是,如果我评论| MINUS INTEGER { 0 - $2 }
,它运作良好。所以问题肯定与此有关。为了调试,我想获得更多信息,换句话说,我想知道什么被认为是MINUS INTEGER
. 我试图添加打印:
但是解析时没有打印任何内容。
谁能告诉我如何打印信息或调试它?
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 3
and 2
are index
,`R[3]C
and R[2]C
are e_cell
,and R[3]C-R[2]C
is e_expression
。
有人可以帮忙吗?
parsing - 解析子程序列表
我已经写了parser_sub.mly
,lexer_sub.mll
它可以解析一个subroutine
. A是由andsubroutine
包围的语句块。Sub
End Sub
实际上,我要处理的原始文件包含一个子程序列表和一些无用的文本。这是一个例子:
所以我需要编写parser.mly
and lexer.mll
which 可以通过忽略所有注释(例如haha
,' hehe
等)和调用来解析这个文件parser_sub.main
,并返回一个子例程列表。
谁能告诉我如何让解析器忽略所有无用的句子( a
Sub
and之外的句子End Sub
)?这是
/li>parser.mly
我试图写的一部分:for 的规则和解析
procedure_body
很复杂,实际上是在parser_sub.mly
and中定义的lexer_sub.mll
,那么我怎么能允许parser.mly
并且lexer.mll
不重复定义它,而只是调用parser_sub.main
呢?
parsing - 解析中包含 2 个方向(字符串 <-> 标记)的表
我已经定义了一个哈希表keyword_table
来存储我的语言的所有关键字。以下是部分代码:
由于关键字很多,我真的很想尽可能避免重复代码。
在parser.mly
中,似乎%token CALL CASE ...
无法简化,因为必须明确定义每个标记。但是,就reserved_identifier
部分而言,是否可以调用函数从令牌返回字符串,而不是对每个字符串进行硬编码?
因此,这可能表明哈希表不适合此目的。哪种数据结构是双方搜索的最佳选择(我们假设双方的每个键都是唯一的)?因此,我们要实现find_0 table "Call"
returns token CALL
(用于lexer.mll
)和find_1 table CALL
returns "Call"
(用于parser.mly
)。
另外,如果table
可以定义,我应该把它放在哪里以便parser.mly
可以使用它?
parsing - 解析中的异常处理
我正在编写一个分析许多独立文件的分析器。所有文件都具有相同的结构:它有一个Initiation()
, 后跟几个过程。例如:
启动一切,然后每个程序的Initiation()
分析是独立的。在分析它们之前,我需要对它们进行解析。
在main.ml
我let procedures = Parser.main Lexer.token buf
用来调用解析。如果一切顺利,procedures
包含过程的抽象语法树:Initiation()
、、procedure1()
等。
但是,在当前阶段,如果在解析过程时解析引发错误,它会返回 a Parser.Error
,并停止解析整个文件。结果,无法解析麻烦程序之后的程序。
我想做的是在某处进行错误处理,以便let procedures = Parser.main Lexer.token buf
始终成功,即使在程序的一部分内部无法解析(在这种情况下,它的值可以是UnparseableProcedure
,而不是抽象语法树)。
目的实际上是为每个文件解析尽可能多的程序,然后尽可能多地分析它们......
有谁知道该怎么做?
parsing - 解析中的优先级
我重新表述了我之前提出的一个问题。目的是了解优先级在解析中的工作原理。
我想解析一个语句a(3).value = 100
。parser.mly
如下在读取后停止.
,并返回错误。
但是,如果我将专用于argument_list
(en-globed by begin
and end
) 的部分移动到文件的末尾(因此它位于 之后l_expression
),则解析效果很好。
在语句被解析的情况下,它被简化为 a let_statement
of data_manipulation_statement
; a(3).value
减少到member_access_expression
; a(3)
被简化为index_expression
; 并3
减少到argument_list
。
在无法解析语句的情况下,它似乎试图将语句的开头减少为 a call_statement
of control_statement
... 它以错误结束。
我一直认为,无论优先级是什么,解析总是拒绝那些不能以成功结束的归约。但那里似乎尝试过又失败了,拒绝尝试其他可能性……
谁能帮忙澄清一下?
parsing - 解析两种语句,具有优先级
我想同时解析f(arg).method
和;第一个比后者具有更高的优先级。f(arg)
block_statement
parser.mly
can'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
如果可能的话,我不知道如何让解析器进一步阅读。我真的需要解析器来解析这两个语句......有人可以帮忙吗?
parsing - 如果第二条规则失败,请尝试第一条规则
我已经定义了两组标识符IDENTIFIER_ONE
,IDENTIFIER_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
在许多其他规则中编写而不是两个子集,我希望有一个更优雅的解决方案......
parsing - 通过制作单独的 .mly 和 .mll 来检索解析的一部分
我正在编写一个前端来解析一组txt
文件,每个文件包含一组procedures
,例如一个 txt 文件看起来像:
syntax.ml
包含:
parser.mly
好像:
现在,我想检索procedure_declaration
(出于异常处理目的)的解析。这意味着,我想创建parser_pd.mly
and lexer_pd.mll
,并让parser.mly
call parser_pd.main
。因此,parser_pd.mly
看起来像:
由于之前的大部分内容parser.mly
都应该移到parser_pd.mly
中,parser.mly
现在应该比以前轻得多,看起来像:
问题是我不知道如何编写该??????
部分,lexer.mll
哪个应该很轻(因为它只读取 token和END
,并让内容由 处理)。也许一些功能来自SUB
EOS
lexer_pd.mll
Lexing
需要模块中的一些功能?
希望我的问题很清楚......有人可以帮忙吗?
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
?