的,我想分析一組表達式:R[3]C
,R[2]C
,R[3]C-R[2]C
...有衝突,我不能解決... ...衝突在分析一組表達式
這裏是lexer.mll
部分:
rule token = parse
| 'R' { R }
| 'C' { C }
| "RC" { RC }
| ['0'-'9']+ as lxm { INTEGER (int_of_string lxm) }
| '+' { PLUS }
| '-' { MINUS }
| '[' { LBRACKET }
| ']' { RBRACKET }
| eof { EOF }
...
的parser.mly
的一部分:
main:
e_expression EOF { $1 };
e_expression:
| ec = e_cell { EE_rc (Rc.Cell ec) }
| e_expression MINUS e_expression { EE_string_EEL ("MINUS", [$1; $3]) }
e_cell:
| R LBRACKET r = index RBRACKET C c = index { (Rc.I_relative r, Rc.I_absolute c) }
| R LBRACKET r = index RBRACKET C { (Rc.I_relative r, Rc.I_relative 0) }
index:
| INTEGER { $1 }
| MINUS INTEGER { Printf.printf "%n\n" 8; 0 - $2 }
此代碼好奇地不與合作,這裏是parser.conflicts,我真的不明白。
如果我評論在e_cell
行線| R LBRACKET r = index RBRACKET C c = index ...
,代碼可以解析R[3]C-R[2]C
,其中3
和2
是index
,`R[3]C
和R[2]C
是e_cell
和R[3]C-R[2]C
是e_expression
。
任何人都可以幫忙嗎?
謝謝,這工作......但我認爲解析器足夠智能** **期待**,得知'等待INTEGER完成e_cell'在我們的例子中是不可能的,並且'現在減少開始在另一個e_expression上工作是它應該做的... – SoftTimur
我會說它可能是LALR(1)而不是LALR(*),在這種情況下它可能無法向前看得遠遠不足以消除歧義因爲它需要兩個令牌來確定它(MINUS和下面的INTEGER或R) – MWB