@@ -240,13 +240,13 @@ fn parse_stat(p: &mut LuaParser) -> ParseResult {
240240 LuaTokenKind :: TkReturn => parse_return ( p) ?,
241241 LuaTokenKind :: TkBreak => parse_break ( p) ?,
242242 LuaTokenKind :: TkContinue => parse_continue ( p) ?,
243- LuaTokenKind :: TkConst => parse_const ( p) ?,
243+ LuaTokenKind :: TkConst => try_parse_const ( p) ?,
244244 LuaTokenKind :: TkDo => parse_do ( p) ?,
245245 LuaTokenKind :: TkRepeat => parse_repeat ( p) ?,
246246 LuaTokenKind :: TkGoto => parse_goto ( p) ?,
247247 LuaTokenKind :: TkDbColon => parse_label_stat ( p) ?,
248248 LuaTokenKind :: TkSemicolon => parse_empty_stat ( p) ?,
249- _ => parse_assign_or_expr_or_global_stat ( p) ?,
249+ _ => parse_assign_or_expr_or_soft_keyword_stat ( p) ?,
250250 } ;
251251
252252 Ok ( cm)
@@ -645,8 +645,9 @@ fn parse_local(p: &mut LuaParser) -> ParseResult {
645645 Ok ( m. complete ( p) )
646646}
647647
648- fn parse_const ( p : & mut LuaParser ) -> ParseResult {
648+ fn try_parse_const ( p : & mut LuaParser ) -> ParseResult {
649649 let mut m = p. mark ( LuaSyntaxKind :: ConstStat ) ;
650+ p. set_current_token_kind ( LuaTokenKind :: TkConst ) ;
650651 p. bump ( ) ; // consume 'const'
651652
652653 match p. current_token ( ) {
@@ -773,6 +774,7 @@ fn parse_break(p: &mut LuaParser) -> ParseResult {
773774
774775fn parse_continue ( p : & mut LuaParser ) -> ParseResult {
775776 let m = p. mark ( LuaSyntaxKind :: ContinueStat ) ;
777+ p. set_current_token_kind ( LuaTokenKind :: TkContinue ) ;
776778 p. bump ( ) ;
777779 if_token_bump ( p, LuaTokenKind :: TkSemicolon ) ;
778780 Ok ( m. complete ( p) )
@@ -878,12 +880,24 @@ fn try_parse_global_stat(p: &mut LuaParser) -> ParseResult {
878880 Ok ( m. complete ( p) )
879881}
880882
881- fn parse_assign_or_expr_or_global_stat ( p : & mut LuaParser ) -> ParseResult {
882- if p. parse_config . level >= LuaLanguageLevel :: Lua55 && p. current_token ( ) == LuaTokenKind :: TkName
883- {
884- let token_text = p. current_token_text ( ) ;
885- if token_text == "global" {
886- let cm = try_parse_global_stat ( p) ?;
883+ fn try_soft_keyword_stat ( p : & mut LuaParser ) -> Option < ParseResult > {
884+ let keyword = p. current_token_text ( ) ;
885+ match keyword {
886+ "global" if p. parse_config . support ( LuaFeatures :: GlobalDeclaration ) => {
887+ Some ( try_parse_global_stat ( p) )
888+ }
889+ "const" if p. parse_config . support ( LuaFeatures :: ConstDeclaration ) => {
890+ Some ( try_parse_const ( p) )
891+ }
892+ "continue" if p. parse_config . support ( LuaFeatures :: Continue ) => Some ( parse_continue ( p) ) ,
893+ _ => None ,
894+ }
895+ }
896+
897+ fn parse_assign_or_expr_or_soft_keyword_stat ( p : & mut LuaParser ) -> ParseResult {
898+ if p. current_token ( ) == LuaTokenKind :: TkName {
899+ if let Some ( cm_result) = try_soft_keyword_stat ( p) {
900+ let cm = cm_result?;
887901 if !cm. is_invalid ( ) {
888902 return Ok ( cm) ;
889903 }
@@ -921,7 +935,10 @@ fn parse_assign_or_expr_or_global_stat(p: &mut LuaParser) -> ParseResult {
921935 }
922936
923937 // 验证左值
924- if !matches ! ( cm. kind, LuaSyntaxKind :: NameExpr | LuaSyntaxKind :: IndexExpr ) {
938+ if !matches ! (
939+ cm. kind,
940+ LuaSyntaxKind :: NameExpr | LuaSyntaxKind :: IndexExpr | LuaSyntaxKind :: SafeIndexExpr
941+ ) {
925942 p. push_error ( LuaParseError :: syntax_error_from (
926943 & t ! ( "invalid left-hand side in assignment (expected variable or table index)" ) ,
927944 range,
@@ -937,7 +954,9 @@ fn parse_assign_or_expr_or_global_stat(p: &mut LuaParser) -> ParseResult {
937954 Ok ( expr_cm) => {
938955 if !matches ! (
939956 expr_cm. kind,
940- LuaSyntaxKind :: NameExpr | LuaSyntaxKind :: IndexExpr
957+ LuaSyntaxKind :: NameExpr
958+ | LuaSyntaxKind :: IndexExpr
959+ | LuaSyntaxKind :: SafeIndexExpr
941960 ) {
942961 p. push_error ( LuaParseError :: syntax_error_from (
943962 & t ! (
0 commit comments