我编写了一个词法分析器和解析器来分析线性代数语句。 每个语句由一个或多个表达式组成,后跟一个或多个声明。 我正在使用menhir和OCaml来编写词法分析器和解析器。

例如:Ax = b,其中A是可逆的。

这应该被理解为A * x = b,(A,可逆)

在表达式中,所有id必须是大写或小写符号。 我想重载乘法运算符,以便用户不必输入'*'符号。

但是,由于词法分析器还需要能够读取字符串(例如在这种情况下为“可逆”),表达式的“Ax”部分将作为字符串发送到解析器。 这会导致解析器错误,因为在语句的表达式部分中不应遇到任何字符串。

这是语法的基本思想

stmt :=
  | expr "."
  | decl "."
  | expr "," decl "."

expr :=
  | term
  | unop expr
  | expr binop expr

term :=
  | <int> num
  | <char> id
  | "(" expr ")"

decl :=
  | id "is" kinds

kinds :=
  | <string> kind
  | kind "and" kinds

有没有办法分离各个字符并告诉解析器它们应该被视为乘法? 有没有办法改变词法分析器,以便足够聪明地知道逗号之前的所有字符簇都是id,后面的所有簇都应该被视为字符串?

===============>>#1 票数:3 已采纳

在我看来,你有两个问题:

  1. 您希望词法分析器在不同的地方以不同方式处理字符序列。

  2. 您希望乘法由相邻表达式指示(中间没有运算符)。

我将在词法分析器中解决的第一个问题。

一个问题是为什么你说你需要使用字符串。 这意味着你可以说有一套完全开放的东西。 这可能是真的,但是如果你可以将自己限制在一个很小的数字,你可以使用关键字而不是字符串。 例如, invertible是一个关键字。

如果你真的想在这些地方允许任何字符串,那么肯定仍然可以破解词法分析器,以便它保持描述它所看到的状态,并展望未来。 如果您不需要遵守预定义的语法,则可以调整语法以使其更容易。 (例如,您只能将逗号用于一个目的。)

对于第二个问题,我要说你需要为你的语法添加邻接。 即,你的语法需要一个规则,如term := term term 我怀疑让它正常工作很棘手,但它确实在OCaml(其中相邻表达式代表函数应用程序)和awk(其中相邻表达式表示字符串连接)中有效。

  ask by Tom Leu translate from so

未解决问题?本站智能推荐:

2回复

制作一个包含令人可见的标记的表格.mly和.mll由menhir显示

我想定义一个keyword_table ,它将一些字符串映射到一些标记,我想使这个表对于parser.mly和lexer.mll都可见。 似乎必须在parser.mly定义表。 但是,我不能在lexer.mll使用它 正如这条评论所暗示的那样, menhir有一个解决方案,
1回复

OCaml Menhir:语法不起作用

我正在使用menhir定义ML中的Modern Compiler Implementation中描述的Tiger语言, 这是手册: 但是,此语法不能识别a[3]类a[3]字符串,但可以识别ab 。 然后我向左值添加另一个规则 现在我的语法可以识别a[3] 但不能识别a[r]
3回复

OCaml + Menhir编译/写作

对于OCaml来说,我是一个完全新手。 我最近才开始使用这种语言(大约2周前),但不幸的是,我的任务是制作语法分析器(解析器+词法分析器,其功能是接受或不接受句子)以获得一种语言使用Menhir。 现在,我在互联网上找到了一些有关OCaml和Menhir的资料: Menhir手册。
1回复

将Menhir与sedlex一起使用

我需要用巨石与sedlex无论出于何种原因(UTF-8),但不知道如何使生成的解析器取决于Sedlexing而不是Lexing 。 有小费吗? 当我跑步 生成的程序与Lexing... 我可以手动更改它,但是必须有另一种方法,不是吗?
1回复

ocaml menhir解析器的产量从未减少

我正在学习如何解析简单程序。 这是我的词法分析器。 我的“ ast”: 我的解析器: 我目前正在解析普通的“字符串”,即some text或“字符串”的“数组”,即- item1 - item2 。 当我用Menhir编译解析器时,我得到: 我是解析新
1回复

是否可以使用Menhir创建非常宽松的语法?

我正在尝试解析Verilog的一些点点滴滴-我主要对提取模块定义和实例化感兴趣。 在verilog中,模块的定义如下: 并以两种可能的方式之一实例化一个模块: 至此,我只想查找已定义或实例化模块的名称; 在以上两种情况下均为“ foo”。 鉴于此竖线语法(verPa
2回复

一系列带有menhir的可选语法规则

我想使用Menhir解析器在OCaml中实现以下语法。 应该有四个不同的陈述相继出现,但是,其中任何三个都可能丢失。 因此,任何程序都至少包含其中一个语句,但可以包含更多来自某个特定顺序的语句。 这是语法: 是否有可能以更简洁的方式表达? 以下是此语法的parser.
2回复

看似等效的Menhir规则改变了语法中的移位/减少冲突

我正在使用Menhir创建一个解析器,并且有一种行为总是让我绊倒,但我不明白。 我创建了以下最小示例来演示它; 这以Go语言( http://golang.org/ref/spec#Method_declarations )的方法声明显示了接收方参数的声明: 据我所知,这两个规则在语
1回复

为Menhir配备抽象语法树时发生类型错误

编辑: 我下面的问题仍然存在,但是我很欣赏如果不仔细检查一堆代码很难回答。 因此,要提出一个类似的问题, 是否有人使用Menhir来实现AST的任何例子? 最好不要像计算器那样的“玩具”项目,但我将不胜感激。 原始问题: 我正在尝试使用Menhir来实现抽象语法树,但我似乎
1回复

在Menhir / Ocamlyacc中为运算符指定动态优先级和优先级

我正在尝试使用Menhir解析器(类似于Ocamlyacc)解析运算符具有动态属性(优先级和优先级)的语言。 在lexing阶段,所有运算符都填充一个OP:string标记(所以“+”变成(OP "+")等)。 运算符属性在解析时确定,并填充关联运算符及其属性的表。 鉴于此表,我如何指