2

私は以前に尋ねた質問を再定式化します。目的は、構文解析で優先順位がどのように機能するかを理解することです。

ステートメントを解析したいと思いa(3).value = 100ます。parser.mly次のようにすると、 の読み取り後に停止し.、エラーが返されます。

ただし、専用の部分argument_list( と で囲まれbeginendいる) をファイルの最後 (つまり の後l_expression) に移動すると、解析はうまく機能します。

ステートメントが解析される場合、それはlet_statementof に縮小されdata_manipulation_statementます。a(3).valueに縮小されmember_access_expressionます。a(3)に縮小されindex_expressionます。となり、3に減少しargument_listます。

文が解析できない場合、文の先頭を of に縮めようとしているようでcall_statementcontrol_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 } 
4

1 に答える 1