我正在尝试在OCaml
写一个翻译,我在这里遇到了问题。
在我的程序中,我想调用这样的函数,例如:
print (get_line 4) // print: print to stdout, get_line: get a specific line in a file
我该怎么做?问题在于我们的解析器,我认为它定义了程序的运行方式,函数的定义方式以及程序的流程。这是我到目前为止解析器词法分析器(下面的代码),但它似乎没有用。我没有看到我的代码和OCaml site上的计算器之间有任何区别,首先评估括号内的语句,然后将其值返回到其父操作以进行下一次评估。
在我的解释器中,括号内的函数get_line
首先进行评估,但我认为它不会将值返回给print
函数,或者它确实是错误的类型(已选中,但是我不知道)我认为这是错误的。)
计算器和我的解释器之间的一个区别是计算器正在使用原始类型,我的是函数。但它们应该是相似的。
这是我的代码,只是其中的一部分:
parser.mly:
%token ODD
%token CUT
%start main
%type <Path.term list> main
%%
main:
| expr EOL main {$1 :: $3}
| expr EOF { [$1] }
| EOL main { $2 }
;
expr:
| ODD INT { Odd $2}
| ODD LPAREN INT RPAREN expr { Odd $3 }
| CUT INT INT { Cut ($2, $3)}
| CUT INT INT expr { Cut ($2, $3) }
lexer.mll:
{
open Parser
}
(* define all keyword used in the program *)
rule main =
parse
| ['\n'] { EOL }
| ['\r']['\n'] { EOL }
| [' ''\t''\n'] { main lexbuf }
| '(' { LPAREN }
| ')' { RPAREN }
| "cut" { CUT }
| "trunclength" { TRUNCLENGTH }
| "firstArithmetic" { FIRSTARITH }
| "f_ArithmeticLength" { F_ARITHLENGTH }
| "secondArithmetic" { SECARITH }
| "s_ArithmeticLength" { S_ARITHLENGTH }
| "odd" { ODD }
| "oddLength" { ODDLENGTH }
| "zip" { ZIP }
| "zipLength" { ZIPLENGTH }
| "newline" { NEWLINE }
| eof { EOF }
| ['0' - '9']+ as lxm { INT(int_of_string lxm) }
| ['a'-'z''A'-'Z'] ['a'-'z''A'-'Z''0'-'9']* as lxm { STRING lxm }
答案 0 :(得分:0)
| ODD LPAREN INT RPAREN expr { Odd $3 }
您的语法规则在括号内需要INT
。您需要将其更改为expr
。这有很多其他问题,但我会留下它。
答案 1 :(得分:0)
首先,您的解析器只尝试构建Path.term
的列表,但您想用它做什么?
然后,你的解析器有很多问题,所以我真的不知道从哪里开始。例如,expr
规则的第二和第四种情况完全忽略了最后一个expr
。此外,您的解析器仅识别包含&#34; odd&lt; int&gt;&#34; (或&#34; odd(&lt; int&gt;)&#34;)和&#34; cut&lt; int&gt; &lt; int&gt;&#34;,那么如何评估print
和get_line
?您应该编辑您的问题并尝试使其更清晰。
要评估表达式,您可以
如果您想要解释print (get_line 4)
,您的解析器需要知道print
和get_line
的含义。在您的代码中,您的解析器会将print
或get_line
视为STRING
令牌(具有字符串值)。由于它们似乎是您所用语言的关键字,因此您的词法分析器应识别它们并返回特定标记。