2012-12-20 25 views
2

我儘量讓一類節目的前端...有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個解析器中實現所有功能。下面是部分代碼,這是不行的,但它仍然認爲R4C5identifier,而不是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.mllparser.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 }等,但它沒有工作......任何人都可以幫忙嗎?

回答

1

我認爲最簡單的選擇是擁有兩個不同的詞法分析器和兩個不同的解析器;請從全局分析器內部調用詞法分析器&解析器獲取公式。事實之後,您可以看到兩個語法之間有多少共享,並在可能的情況下將事物分解。

+0

gasche和@didierc,我想也許我們可以添加一個公式切入點,以不同的方式來翻譯公式......請看看我的OP中的新更新嗎? – SoftTimur