我重新提出了一個我以前問過的問題。目的是瞭解優先級在解析中的工作原理。解析中的優先級
我想解析一條語句a(3).value = 100
。 parser.mly
在閱讀.
後停止,並返回錯誤。
但是,如果我將竭誠爲argument_list
部分(由begin
和end
EN-globed)在文件的結尾(因此是l_expression
)之後,解析效果很好。
在語句被解析的情況下,它被簡化爲let_statement
的data_manipulation_statement
; a(3).value
減至member_access_expression
; a(3)
減少到index_expression
;和3
減少到argument_list
。
在無法解析語句的情況下,它似乎試圖將語句的開頭減少到control_statement
的call_statement
......它以錯誤結束。
我一直認爲,無論優先級是什麼,解析總是會拒絕不能以成功結束的減少。但在那裏,似乎它嘗試和失敗,並拒絕嘗試其他可能性...
任何人都可以幫助澄清?
statement:
| control_statement { $1 }
| data_manipulation_statement { BS_DMS $1 }
control_statement: | control_statement_except_multiline_if { BS_CSEMI $1 }
control_statement_except_multiline_if: | call_statement { $1 }
call_statement: | simple_name_expression argument_list { CSEMI_SNE_AL ($1, $2) }
data_manipulation_statement: | let_statement { $1 }
let_statement: | l_expression EQUAL expression { DMS_let (None, $1, $3) }
simple_name_expression: | name { $1 }
index_expression: | l_expression LPAREN argument_list RPAREN { IE_LE_AL ($1, $3) }
member_access_expression: | l_expression DOT unrestricted_name { MAE_LE_UN ($1, $3) }
literal_expression: | INTEGER { LIE_INT $1 }
unrestricted_name: | name { UN_N $1 }
name: | untyped_name { N_UN $1 }
untyped_name: | IDENTIFIER { UN_I $1 }
expression:
| l_expression { E_LE $1 }
| value_expression { E_VE $1 }
value_expression:
| literal_expression { VE_LIE $1 }
| parenthesized_expression { VE_PE $1 }
(***** begin argument_list *****)
argument_list: | positional_or_named_argument_list { AL_PONAL $1 }
positional_or_named_argument_list:
| positional_argument_COMMAs required_positional_argument { PONAL_PAs_RPA (List.rev $1, $2) }
positional_argument_COMMAs:
/* empty */ { [] }
| positional_argument_COMMAs positional_argument COMMA { $2 :: $1 }
positional_argument: | argument_expression { $1 }
required_positional_argument: | argument_expression { $1 }
argument_expression: | expression { AE_expression (None, $1) }
(***** end argument_list *****)
l_expression:
| simple_name_expression { LE_SNE $1 }
| index_expression { LE_IE $1 }
| member_access_expression { LE_MAE $1 }