我儘量讓一類節目的前端...有2個特殊性:不同的翻譯一個詞在一個程序
1)當我們滿足=
開頭的字符串,我想讀休息的字符串作爲formula
而不是字符串值。例如,"123"
,"TRUE"
,"TRUE+123"
被認爲具有string
作爲類型,而"=123"
,"=TRUE"
,"=TRUE+123"
被認爲具有Syntax.formula
作爲類型。順便提一下,
(* in syntax.ml *)
and expression =
| E_formula of formula
| E_string of string
...
and formula =
| F_int of int
| F_bool of bool
| F_Plus of formula * formula
| F_RC of rc
and rc =
| RC of int * int
2)在公式中,一些字符串的解釋與外部不同。例如,在命令R4C5 := 4
,R4C5
,其實是一個變量,被認爲是identifier
,而在"=123+R4C5"
試圖翻譯成公式時,R4C5
被翻譯爲RC (4,5): rc
。
所以我不知道如何用1或2個詞法分析器和1或2個分析器來實現這一點。
目前,我嘗試在1個詞法分析器和1個解析器中實現所有功能。下面是部分代碼,這是不行的,但它仍然認爲R4C5
爲identifier
,而不是rc
:
(* in lexer.mll *)
let begin_formula = double_quote "="
let end_formula = double_quote
let STRING = double_quote ([^ "=" ])* double_quote
rule token = parse
...
| begin_formula { BEGIN_FORMULA }
| 'R' { R }
| 'C' { C }
| end_formula { END_FORMULA }
| lex_identifier as li
{ try Hashtbl.find keyword_table (lowercase li)
with Not_found -> IDENTIFIER li }
| STRING as s { STRING s }
...
(* in parser.mly *)
expression:
| BEGIN_FORMULA f = formula END_FORMULA { E_formula f }
| s = STRING { E_string s }
...
formula:
| i = INTEGER { F_int i }
| b = BOOL { F_bool b }
| f0 = formula PLUS f1 = formula { F_Plus (f0, f1) }
| rc { F_RC $1 }
rc:
| R i0 = INTEGER C i1 = INTEGER { RC (i0, i1) }
誰能幫助?
新的想法:我想堅持1個詞法+ 1個分析器,並創建一個入口點式在詞法分析器作爲我們的comment
通常做的......這裏是lexer.mll
和parser.mly
一些更新:
(* in lexer.mll *)
rule token = parse
...
| begin_formula { formula lexbuf }
...
| INTEGER as i { INTEGER (int_of_string i) }
| '+' { PLUS }
...
and formula = parse
| end_formula { token lexbuf }
| INTEGER as i { INTEGER_F (int_of_string i) }
| 'R' { R }
| 'C' { C }
| '+' { PLUS_F }
| _ { raise (Lexing_error ("unknown in formula")) }
(* in parser.mly *)
expression:
| formula { E_formula f }
...
formula:
| i = INTEGER_F { F_int i }
| f0 = formula PLUS_F f1 = formula { F_Plus (f0, f1) }
...
我已經做了一些測試,比如解析"=R4"
,問題是,它可以很好解析R
,但它認爲4
作爲INTEGER
而不是INTEGER_F
,似乎formula lexbuf
需要不時加入formula
入口點(雖然我不明白爲什麼在token
入口點正文中的解析工作原理並不總是提到token lexbuf
)。我嘗試了幾種可能性:| 'R' { R; formula lexbuf }
,| 'R' { formula lexbuf; R }
等,但它沒有工作......任何人都可以幫忙嗎?
gasche和@didierc,我想也許我們可以添加一個公式切入點,以不同的方式來翻譯公式......請看看我的OP中的新更新嗎? – SoftTimur