问题标签 [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 投票
3 回答
1138 浏览

ocaml - 从显式令牌列表中输入 ocamlyacc 解析器?

是否可以为 OCamlYacc 生成的解析器提供显式令牌列表以进行分析?

我想使用 OCamlLex 显式生成一个令牌列表,然后我稍后使用 Yacc 生成的解析器对其进行分析。但是,标准用例会生成一个解析器,该解析器会为下一个标记隐式调用词法分析器。这里的令牌是在 yacc 分析期间而不是之前计算的。从概念上讲,解析器应该只处理标记,但 Yacc 生成的解析器提供了一个依赖于词法分析器的接口,在我的情况下我不需要。

0 投票
1 回答
1107 浏览

parsing - 在 Menhir/Ocamlyacc 中为操作员指定动态优先级和优先级

我正在尝试使用 Menhir 解析器(类似于 Ocamlyacc)解析运算符具有动态属性(优先级和优先级)的语言。在词法分析阶段,所有运算符都填充一个OP:string标记(因此“+”变成(OP "+"),等等)。

运算符属性在解析时确定并填充关联运算符及其属性的表。鉴于此表,我如何指示 Menhir 根据此表的数据动态更改解析运算符的规则的优先级?

谢谢,查理P。

0 投票
2 回答
398 浏览

metaprogramming - 在 OCaml 顶层中嵌入特定领域的语言——是否嵌入到 Camlp4?

我有一些代码,其中包含menhir基于域的 特定 语言(逻辑)的解析器。为了我在调试时的理智,能够像这样直接在顶层键入这种语言(公式)的实例会很棒:

campl4/5我唯一的选择吗?如果是,我觉得文档相当吓人。是否有一个与我的用例足够接近并且我可以适应的示例/教程?(例如,引入新关键字的语法扩展似乎不相关)。谢谢!

0 投票
2 回答
323 浏览

ocaml - ocamllex 正则表达式的外部定义

我已经实现了 lexer/parser/pretty-printer 的常用组合,用于在我的代码中读入/打印类型。当涉及到通常用于符号、标点符号或分隔符的纯字符串正则表达式时,我发现词法分析器和漂亮打印机之间存在冗余。

例如我现在有

在我的lexer.mll文件中,以及类似的功能:

用于漂亮的印刷。如果我决定更改 TURNSTILE 的字符串,我必须编辑代码中的两个地方,我觉得这不太理想。

显然,OCaml 词法分析器支持一定的能力来定义正则表达式,然后mll文件中引用它们。所以lexer.mll可以写成

但这不会让我symb_turnstile从外部访问,比如我的漂亮打印功能。事实上,在运行之后ocamllex,并没有出现symb_turnstilein lexer.ml。我什至无法在lexer.mll.

有没有办法做到这一点?

0 投票
2 回答
1657 浏览

parsing - 使用 ocamllex/ocamlyacc 解析部分语法

我一直在使用正则表达式来检查一堆 Verilog 文件并提取某些语句。目前,正则表达式对此很好,但是,我开始意识到需要一个真正的解析器来处理嵌套结构,所以我正在研究 ocamllex/ocamlyacc。我想首先复制我在正则表达式实现中得到的内容,然后慢慢地在语法中添加更多内容。

现在我主要对提取模块声明和实例感兴趣。为了让这个问题更简短,让我们只看一下模块声明。

在 Verilog 中,模块声明如下所示:

我当前的正则表达式实现只是检查是否有一个使用特定名称声明的模块(检查我感兴趣的名称列表 - 我不需要找到所有模块声明,只是具有特定名称的模块声明)。所以基本上,我得到了我想要解析的 Verilog 文件的每一行并进行这样的匹配(带有 Pythonish 和 Rubyish 元素的伪 OCaml):

这很好用。模块声明可以出现在 Verilog 文件中的任何位置;我只是想知道该文件是否包含该特定声明,我不在乎该文件中可能还有什么。

我第一次尝试将其转换为 ocamllex/ocamlyacc:

verLexer.mll:

verParser.mly:

然后在 REPL 中尝试一下:

太好了,它有效!

然而,一个真正的 Verilog 文件将不止包含一个模块声明:

我并不真正关心该模块定义之前或之后出现的内容,有没有办法只提取语法的那部分以确定Verilog文件包含'module foo('语句?是的,我意识到正则表达式是工作正常,但是,如上所述,我计划慢慢地发展这个语法并添加更多元素,正则表达式将开始分解。

编辑:我在 lex 规则中添加了一个 match any char:

认为它会跳过迄今为止不匹配的任何字符,但这似乎不起作用:

0 投票
1 回答
206 浏览

ocaml - OCaml 解析器代码

我的代码:

当我运行它时, ocamlc -c parser.ml我看到:

大家可以帮我证明这个问题吗?我知道第 75 行的类型与 Syntax.ml 和 Syntax.mll 中定义的类型 Syntax.term 不匹配,但我想将类型 0.0 指定给 Syntax.term 来证明这一点。我可以做吗??

- - - - - - - - - - 编辑 - - - - - - - - - :

术语类型:

每件事都正常工作,我想在我的代码中添加分配,我使用上面的代码将 VAR 添加到 Term。我为它创建了哈希表和其他东西,但这部分让我感到困惑......

- - - - - - - - - - - /编辑 - - - - - - - - - - - -

tnx ;)

0 投票
0 回答
141 浏览

debugging - ocamlyacc 中的冲突

我正在尝试为一种使用 ocamlyacc 识别整数和浮点表达式的简单语言编写解析器。但是,我想介绍具有变量的可能性。所以我在我的lexer.mll文件中定义了令牌VAR ,它允许它是任何以大写字母开头的字母数字字符串。

现在我对实数有了类似的定义。但是,当我运行此文件时,我会遇到 2 个减少/减少冲突,因为如果我只是输入一个随机字符串(标识为令牌 VAR)。解析器不知道它是实数还是整数类型的变量,因为在我的语法中定义 int 和 real 表达式时存在关键字 VAR。

如何在不失去变量声明的一般性和维护我可用的 2 种数据类型的情况下消除这种减少/减少冲突。

0 投票
2 回答
155 浏览

ocaml - 解析器定义规则中的整数 - Ocaml

为我的解析器编译以下规则时遇到问题:

%%

表达式:

这是一个赋值规则,它接受一个整数,然后是赋值(等号)和一个表达式,如我的 AST 中所定义:

type expr = Asn of int * expr

当然,编译器会抱怨,因为我正在定义“ expr ASN expr”,第一个参数应该是整数,而不是表达式。但是,我无法弄清楚指定这一点的语法。

如果有人能引导我朝着正确的方向前进,我将不胜感激。

谢谢!

0 投票
1 回答
112 浏览

ocaml - 访问匹配字符串 ocamllex 的一部分

我正在尝试安排 ocamllex 和 ocamlyacc 代码来扫描和解析一种简单的语言。我已经定义了相同的抽象语法,但发现难以扫描复杂的规则。这是我的代码

但我无法访问匹配字符串的某些部分。由于表达式声明是递归的,嵌套函数也无济于事(?)。请帮忙。

0 投票
2 回答
511 浏览

ocaml - if then else in ocamlyacc

Can anyone brief how can I implement if then else in Ocamlyacc. I've defined tokens from lexical analyzer(ocamllex) namely IF, THEN, ELSE. For the if statement, I have defined tokens: GREATERTHAN, LESSERTHAN, EQUALTO for integers. I've searched many tutorials but to no avail!

UPDATE:

I want to interpret the result and return the value of the expression dictated by the if-else statement.