- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当谈到 OCaml 时,我是一个完整的新手。我最近才开始使用该语言(大约 2 周前),但不幸的是,我的任务是为一种组合语言制作一个语法分析器(解析器 + 词法分析器,其功能是接受或不接受句子)使用门希尔。现在,我在网上找到了一些关于 OCaml 和 Menhir 的资料:
Menhir手册。
This webpage for some French University course.
在 Sourceforge 的 Toss 主页上的 Menhir 简短教程。
derdon 在 github 上的 Menhir 示例。
A book on OCaml (with a few things about ocamllex+ocamlyacc
SooHyoung Oh 的随机 ocamllex 教程。
以及 Menhir 源代码附带的示例。
(我不能放两个以上的超链接,所以我不能把你直接链接到我在这里提到的一些网站。对不起!)
所以,正如你所看到的,我一直在拼命地寻找越来越多的 Material 来帮助我制作这个程序。不幸的是,我仍然无法掌握许多概念,因此我遇到了很多很多困难。
对于初学者,我不知道如何正确编译我的程序。我一直在使用以下命令:
ocamlbuild -use-menhir -menhir "menhir --external-tokens Tokens" main.native
let filename = Sys.argv.(1)
let () =
let inBuffer = open_in filename in
let lineBuffer = Lexing.from_channel inBuffer in
try
let acceptance = Parser.main Lexer.main lineBuffer in
match acceptance with
| true -> print_string "Accepted!\n"
| false -> print_string "Not accepted!\n"
with
| Lexer.Error msg -> Printf.fprintf stderr "%s%!\n" msg
| Parser.Error -> Printf.fprintf stderr "At offset %d: syntax error.\n%!" (Lexing.lexeme_start lineBuffer)
{
open Tokens
exception Error of string
}
rule main = parse
| [' ' '\t']+
{ main lexbuf }
| ['0'-'9']+ as integer
{ INT (int_of_string integer) }
| "True"
{ BOOL true }
| "False"
{ BOOL false }
| '+'
{ PLUS }
| '-'
{ MINUS }
| '*'
{ TIMES }
| '/'
{ DIVIDE }
| "def"
{ DEF }
| "int"
{ INTTYPE }
| ['A'-'Z' 'a'-'z' '_']['0'-'9' 'A'-'Z' 'a'-'z' '_']* as s
{ ID (s) }
| '('
{ LPAREN }
| ')'
{ RPAREN }
| '>'
{ LARGER }
| '<'
{ SMALLER }
| ">="
{ EQLARGER }
| "<="
{ EQSMALLER }
| "="
{ EQUAL }
| "!="
{ NOTEQUAL }
| '~'
{ NOT }
| "&&"
{ AND }
| "||"
{ OR }
| '('
{ LPAREN }
| ')'
{ RPAREN }
| "writeint"
{ WRITEINT }
| '\n'
{ EOL }
| eof
{ EOF }
| _
{ raise (Error (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf))) }
%start <bool> main
%%
main:
| WRITEINT INT { true }
%token <string> ID
%token <int> INT
%token <bool> BOOL
%token EOF EOL DEF INTTYPE LPAREN RPAREN WRITEINT
%token PLUS MINUS TIMES DIVIDE
%token LARGER SMALLER EQLARGER EQSMALLER EQUAL NOTEQUAL
%token NOT AND OR
%left OR
%left AND
%nonassoc NOT
%nonassoc LARGER SMALLER EQLARGER EQSMALLER EQUAL NOTEQUAL
%left PLUS MINUS
%left TIMES DIVIDE
%nonassoc LPAREN
%nonassoc ATTRIB
%{
type token =
| ID of (string)
| INT
| BOOL
| DEF
| INTTYPE
| LPAREN
| RPAREN
| WRITEINT
| PLUS
| MINUS
| TIMES
| DIVIDE
| LARGER
| SMALLER
| EQLARGER
| EQSMALLER
| EQUAL
| NOTEQUAL
| NOT
| AND
| OR
| EOF
| EOL
%}
%%
最佳答案
一个更简单的方法是删除 Parser
/Tokens
分离。正如 Thomas 所说,不需要声明 type token = ...
, 因为它是由 menhir 从 %token
自动生成的指令。
所以你可以定义parser.mly
作为:
%start <bool> main
%token <string> ID
%token <int> INT
%token <bool> BOOL
%token EOF EOL DEF INTTYPE LPAREN RPAREN WRITEINT
%token PLUS MINUS TIMES DIVIDE
%token LARGER SMALLER EQLARGER EQSMALLER EQUAL NOTEQUAL
%token NOT AND OR
%left OR
%left AND
%nonassoc NOT
%nonassoc LARGER SMALLER EQLARGER EQSMALLER EQUAL NOTEQUAL
%left PLUS MINUS
%left TIMES DIVIDE
%nonassoc LPAREN
%nonassoc ATTRIB
%%
main:
| WRITEINT INT { true }
lexer.mll
作为:
{
open Parser
exception Error of string
}
[...] (* rest of the code not shown here *)
tokens.mly
, 并编译
ocamlbuild -use-menhir main.native
关于parsing - OCaml + Menhir 编译/写作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9897358/
我正在学习如何解析简单的程序。 这是我的词法分析器。 { open Parser exception SyntaxError of string } let white = [' ' '\t']+
我正在用 Menhir + Ocamllex 编写一个小型解析器,但我似乎无法同时满足两个要求 我想在出错后继续解析(报告更多错误)。 我想打印发生错误的 token 。 通过使用 error,我只能
当谈到 OCaml 时,我是一个完整的新手。我最近才开始使用该语言(大约 2 周前),但不幸的是,我的任务是为一种组合语言制作一个语法分析器(解析器 + 词法分析器,其功能是接受或不接受句子)使用门希
我有一个非常简单的代数表达式的数据类型(只有标识符、加法和乘法),我想将诸如“a + b * (c + d)”之类的字符串解析为这种类型。我的默认冲动是使用 Ulex+Menhir,但我想知道对于这样
出于某种原因(utf-8),我需要将 menhir 与 sedlex 一起使用,但不知道如何使生成的解析器依赖于 Sedlexing 而不是 Lexing 。有什么建议吗? 当我运行时 menhir
我正在使用 menhir 的 --compile-errors 功能,我对此非常满意。我还使用 ocamlbuild 来管理我的项目的编译。由于该项目非常基础,因此到目前为止构建基础设施仍然微不足道。
Menhir 允许将任意 ocaml 代码添加到 .mly 文件的末尾,我想在其中声明一些函数。但是我找不到让 menhir 将我的函数添加到 .mli 文件的方法,以便它们在其他模块中可见。可能吗?
我发现 Menhir 提供了 --dump 和 --explain 选项,它对调试有很大帮助。但是如何在 ocamlbuild 下启用这些选项,以便 Menhir 在编译时始终生成转储文件? 我尝试编
我是menhir的初学者。 我想知道如何在我自己的语言中像元组模式一样解析 OCaml,这与 OCaml 非常相似。 例如,在表达式 let a,b,c = ... 中,a, b, c 应该像 Tup
我正在使用 Menhir 来解析 DSL。我的解析器使用精心设计的嵌套类型集合构建 AST。在稍后的类型检查和为用户生成的错误报告中的其他传递过程中,我想引用它发生的源文件位置。这些不是解析错误,是解
我想定义一个 keyword_table ,它将一些字符串映射到一些标记,并且我想让这个表对 parser.mly 和 都可见lexer.mll。 看来该表必须在parser.mly中定义, %{
我是一名优秀的程序员,十分优秀!