ocamlyacc

    0熱度

    2回答

    我在寫一個解釋器,使用ocamlyacc和ocamllex編譯我的解析器和詞法分析器。 我的問題是,我有一個文件卡列斯測試,包含在詞法分析器中定義的兩個命令: print a print b 但解釋只是執行行只print a!我知道問題主要在解析器中,需要遞歸。我將它固定爲這樣(下面的代碼),但它仍然不起作用。 %{ open Path %} %token <int> INT

    1熱度

    2回答

    我是OCaml的初學者,並試圖構建一個解析器,我想要一個列表將所有方法存儲在我的類中。這是我在.mly文件中的一部分。 init_method_list: { [] } | method_list method_decl { List.rev($1) } ; method_list: method_decl { [ $1 ] } | method_li

    1熱度

    1回答

    我正在嘗試構建一個編譯器,目前我已經完全迷失了。我有一個主類,並希望能夠與繼承申報的其他類,即class newClass extends classThatHasBeenDeclaredBefore { }我輸入看起來像 input: class_main class_list { /* New program created */ } 和我class_list包括我在我的程序中

    1熱度

    2回答

    我試圖在OCaml中編寫解釋器,我在這裏遇到問題。 在我的計劃,我想打電話給這樣的函數,例如: print (get_line 4) // print: print to stdout, get_line: get a specific line in a file 我怎麼能這樣做?問題出現在我們的解析器中,我認爲是這樣,因爲它定義了程序將如何運行,函數是如何定義的以及程序的流程。這是我迄今爲

    0熱度

    1回答

    我需要在OCaml解析器中給予高優先級和左關聯性來運行應用程序。我有一大堆不同的令牌它如 %token LET REC EQ IN FUN ARROW %token IF THEN ELSE %token PLUS MINUS MUL DIV LT LE NE AND OR %token LPAREN RPAREN 匹配,我給所有這些優先級和結合使用%left,right ... 然而,

    2熱度

    2回答

    我遇到了關聯性問題。出於某種原因,我=運算符的優先級高於我::運算 因此,舉例來說,如果我有 「1 :: [] = []」 在作爲串,我會得到 1 = [] :: [] 爲我的表達,而不是 [1] = [] 如果我的字符串是 「1 :: 2 :: [] = []」 我以爲它會解析它成exp1 EQ exp2,然後再解析exp1和exp2。但它作爲解析EXP1 COLONCOLON EXP2代替 .

    0熱度

    1回答

    所以我有一個包含空字符串的語法。語法是這樣的: S->ε S->表達;; S 當我運行我的解析器時,我收到錯誤「沒有更多的狀態丟棄」,因此我相信我不能正確表示空字符串。那麼我將如何去表示它,特別是在詞法分析器.mll文件中? 我知道我需要爲此制定一個規則,所以我認爲我有這個原因。這是我認爲它應該看起來像解析器.mly文件,不包括表達的東西。 s: | EMPTY_STRING { [] }

    0熱度

    1回答

    我有下面的代碼也有更多像expr:int {} |布爾{}等,但我不知道什麼是我應該寫在這種解析器的類型,我有一個計算器的例子,與int一起工作,類型是int,但在我的程序中我有浮動字符串等。 %{ dont know what to write here %} %token <int> INT %token <float> FLOAT %token <char> CHAR %to

    5熱度

    1回答

    我寫一個小解析器與巨石+ Ocamllex和我有兩個要求,我似乎無法滿足的同時 我想保持一個錯誤之後解析(報告更多的錯誤)。 我想打印發生錯誤的令牌。 我可以很容易地通過使用error令牌。我也可以使用this question建議的方法輕鬆完成2) 。但是,我不知道一個簡單的方法來實現這兩個。 我處理錯誤的方式,現在是這樣的: pair: | left = prodA SEPARATOR ri

    1熱度

    2回答

    下面是一個ocaml的解析器的樣本代碼: %{ open Ast %} %token PLUS MINUS TIMES DIVIDE EOF %token <int> LITERAL %left PLUS MINUS %left TIMES DIVIDE %start expr %type < Ast.expr> expr %% expr: expr PLUS