이전에 질문 한 내용을 다시 정리합니다. 목적은 구문 분석에서 우선 순위가 작동하는 방식을 이해하는 것입니다.구문 분석의 우선 순위
문 a(3).value = 100
을 구문 분석하고 싶습니다. .
을 읽은 후 다음과 같이 parser.mly
이 멈추고 오류를 반환합니다. 내가 argument_list
전용 부품을 이동하는 경우
그러나, 파일의 끝에 (begin
및 end
에 의해 KO-globed), 구문 분석은 잘 작동합니다 (따라서는 l_expression
이후).
구문이 구문 분석되는 경우 let_statement
이 data_manipulation_statement
으로 줄어 듭니다. a(3).value
은 member_access_expression
으로 축소됩니다. a(3)
은 index_expression
으로 축소됩니다. 3
은 argument_list
으로 줄어 듭니다.
문장을 구문 분석 할 수없는 경우 문장의 시작을 call_statement
control_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 }