summaryrefslogtreecommitdiff
path: root/server/src/parser/grammar.lua
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/parser/grammar.lua')
-rw-r--r--server/src/parser/grammar.lua134
1 files changed, 73 insertions, 61 deletions
diff --git a/server/src/parser/grammar.lua b/server/src/parser/grammar.lua
index d7dd54f8..53884fee 100644
--- a/server/src/parser/grammar.lua
+++ b/server/src/parser/grammar.lua
@@ -159,7 +159,7 @@ CompList <- '<='
/ '~='
/ '=='
BOR <- Sp {'|'}
-BXOR <- Sp {'~'}
+BXOR <- Sp {'~'} !'='
BAND <- Sp {'&'}
Bshift <- Sp {BshiftList}
BshiftList <- '<<'
@@ -177,7 +177,7 @@ Unary <- Sp {} {UnaryList}
UnaryList <- NOT
/ '#'
/ '-'
- / '~'
+ / '~' !'='
POWER <- Sp {'^'}
PL <- Sp '('
@@ -201,7 +201,10 @@ TOCLOSE <- Sp '*toclose'
DirtyAssign <- ASSIGN / {} -> MissAssign
DirtyBR <- BR {} / {} -> MissBR
DirtyTR <- TR {} / {} -> MissTR
-DirtyPR <- PR {} / {} -> MissPR
+DirtyPR <- PR {} / {} -> DirtyPR
+DirtyLabel <- LABEL / {} -> MissLabel
+MaybePR <- PR / {} -> MissPR
+MaybeEnd <- END / {} -> MissEnd
]]
grammar 'Nil' [[
@@ -265,20 +268,33 @@ DirtyName <- {} -> DirtyName
grammar 'Exp' [[
Exp <- Sp ExpOr
-ExpOr <- (ExpAnd (OR ExpAnd)*) -> Binary
-ExpAnd <- (ExpCompare (AND ExpCompare)*) -> Binary
-ExpCompare <- (ExpBor (Comp ExpBor)*) -> Binary
-ExpBor <- (ExpBxor (BOR ExpBxor)*) -> Binary
-ExpBxor <- (ExpBand (BXOR ExpBand)*) -> Binary
-ExpBand <- (ExpBshift (BAND ExpBshift)*) -> Binary
-ExpBshift <- (ExpConcat (Bshift ExpConcat)*) -> Binary
-ExpConcat <- (ExpAdds (Concat ExpConcat)*) -> Binary
-ExpAdds <- (ExpMuls (Adds ExpMuls)*) -> Binary
-ExpMuls <- (ExpUnary (Muls ExpUnary)*) -> Binary
-ExpUnary <- ( (Unary+ (ExpPower / DirtyName)))
- -> Unary
+ExpOr <- (ExpAnd SuffixOr*) -> Binary
+ExpAnd <- (ExpCompare SuffixAnd*) -> Binary
+ExpCompare <- (ExpBor SuffixComp*) -> Binary
+ExpBor <- (ExpBxor SuffixBor*) -> Binary
+ExpBxor <- (ExpBand SuffixBxor*) -> Binary
+ExpBand <- (ExpBshift SuffixBand*) -> Binary
+ExpBshift <- (ExpConcat SuffixBshift*) -> Binary
+ExpConcat <- (ExpAdds SuffixConcat*) -> Binary
+ExpAdds <- (ExpMuls SuffixAdds*) -> Binary
+ExpMuls <- (ExpUnary SuffixMuls*) -> Binary
+ExpUnary <- ( SuffixUnary) -> Unary
/ ExpPower
-ExpPower <- (ExpUnit (POWER ExpUnary)*) -> Binary
+ExpPower <- (ExpUnit SuffixPower*) -> Binary
+
+SuffixOr <- OR (ExpAnd / {} -> DirtyExp)
+SuffixAnd <- AND (ExpCompare / {} -> DirtyExp)
+SuffixComp <- Comp (ExpBor / {} -> DirtyExp)
+SuffixBor <- BOR (ExpBxor / {} -> DirtyExp)
+SuffixBxor <- BXOR (ExpBand / {} -> DirtyExp)
+SuffixBand <- BAND (ExpBshift / {} -> DirtyExp)
+SuffixBshift<- Bshift (ExpConcat / {} -> DirtyExp)
+SuffixConcat<- Concat (ExpConcat / {} -> DirtyExp)
+SuffixAdds <- Adds (ExpMuls / {} -> DirtyExp)
+SuffixMuls <- Muls (ExpUnary / {} -> DirtyExp)
+SuffixUnary <- Unary+ (ExpPower / {} -> DirtyExp)
+SuffixPower <- POWER (ExpUnary / {} -> DirtyExp)
+
ExpUnit <- Nil
/ Boolean
/ String
@@ -288,42 +304,35 @@ ExpUnit <- Nil
/ Function
/ Simple
-Simple <- (Prefix (Suffix)*)
+Simple <- (Prefix (Sp Suffix)*)
-> Simple
-Prefix <- PL Exp PR
+Prefix <- Sp ({} PL DirtyExp DirtyPR)
+ -> Prefix
/ FreeName
-Suffix <- DOT Name?
- / COLON Name?
- / Sp ({} Table {}) -> Call
- / Sp ({} String {}) -> Call
- / Sp ({} BL DirtyExp (BR / Sp) {}) -> Index
- / Sp ({} PL CallArgList DirtyPR) -> Call
+Suffix <- DOT Name / DOT {} -> MissField
+ / Method (!PL {} -> MissPL)?
+ / ({} Table {}) -> Call
+ / ({} String {}) -> Call
+ / ({} BL DirtyExp DirtyBR) -> Index
+ / ({} PL CallArgList DirtyPR) -> Call
+Method <- COLON Name / COLON {} -> MissMethod
DirtyExp <- Exp
/ {} -> DirtyExp
-ExpList <- (COMMA Exp)+
+MaybeExp <- Exp / MissExp
+MissExp <- {} -> MissExp
+ExpList <- Sp (MaybeExp (COMMA (MaybeExp))*)
-> List
- / (Exp (COMMA Exp)*)
+MustExpList <- Sp (Exp (COMMA (MaybeExp))*)
-> List
CallArgList <- Sp ({} (COMMA {} / Exp)+ {})
-> CallArgList
/ %nil
-NameList <- (COMMA MustName)+
- -> List
- / (Name (COMMA MustName)*)
- -> List
- / DirtyName
+NameList <- (MustName (COMMA MustName)*)
-> List
-ArgList <- (COMMA AfterArg)+
- -> List
- / (FirstArg (COMMA AfterArg)*)?
- -> List
-FirstArg <- DOTS
- / Name
-AfterArg <- DOTS
- / MustName
-
+ArgList <- (DOTS / Name / Sp {} COMMA)*
+ -> ArgList
Table <- Sp ({} TL TableFields? DirtyTR)
-> Table
@@ -337,19 +346,11 @@ NewField <- (MustName ASSIGN DirtyExp)
Function <- Sp ({} FunctionBody {})
-> Function
-FunctionBody<- FUNCTION FuncName PL ArgList PR
- (!END Action)*
- END?
- / FUNCTION FuncName PL ArgList PR?
+FuncArg <- PL ArgList MaybePR
+ / {} -> MissPL Nothing
+FunctionBody<- FUNCTION FuncArg
(!END Action)*
- END?
- / FUNCTION FuncName Nothing
- (!END Action)*
- END?
-FuncName <- (Name? (FuncSuffix)*)
- -> Simple
-FuncSuffix <- DOT MustName
- / COLON MustName
+ MaybeEnd
-- 纯占位,修改了 `relabel.lua` 使重复定义不抛错
Action <- !END .
@@ -368,7 +369,7 @@ CrtAction <- Semicolon
/ For
/ While
/ Repeat
- / Function
+ / NamedFunction
/ LocalFunction
/ Local
/ Set
@@ -384,7 +385,7 @@ Semicolon <- SEMICOLON
SimpleList <- (Simple (COMMA Simple)*)
-> List
-Do <- Sp ({} DO DoBody END? {})
+Do <- Sp ({} DO DoBody MaybeEnd {})
-> Do
DoBody <- (!END Action)*
-> DoBody
@@ -392,10 +393,10 @@ DoBody <- (!END Action)*
Break <- BREAK
-> Break
-Return <- RETURN ExpList?
+Return <- RETURN MustExpList?
-> Return
-Label <- LABEL MustName -> Label LABEL
+Label <- LABEL MustName -> Label DirtyLabel
GoTo <- GOTO MustName -> GoTo
@@ -407,7 +408,7 @@ IfHead <- (IfPart -> IfBlock)
IfBody <- IfHead
(ElseIfPart -> ElseIfBlock)*
(ElsePart -> ElseBlock)?
- END?
+ MaybeEnd
IfPart <- IF Exp THEN
{} (!ELSEIF !ELSE !END Action)* {}
/ IF DirtyExp THEN
@@ -430,7 +431,7 @@ Loop <- Sp ({} LoopBody {})
-> Loop
LoopBody <- FOR LoopStart LoopFinish LoopStep DO?
(!END Action)*
- END?
+ MaybeEnd
LoopStart <- MustName ASSIGN DirtyExp
LoopFinish <- COMMA? Exp
/ COMMA? DirtyName
@@ -442,13 +443,13 @@ In <- Sp ({} InBody {})
-> In
InBody <- FOR NameList IN? ExpList DO?
(!END Action)*
- END?
+ MaybeEnd
While <- Sp ({} WhileBody {})
-> While
WhileBody <- WHILE Exp DO
(!END Action)*
- END?
+ MaybeEnd
Repeat <- Sp ({} RepeatBody {})
-> Repeat
@@ -464,8 +465,19 @@ Set <- (SimpleList ASSIGN ExpList?)
Call <- Simple
LocalFunction
- <- Sp ({} LOCAL FunctionBody {})
+ <- Sp ({} LOCAL FunctionNamedBody {})
-> LocalFunction
+
+NamedFunction
+ <- Sp ({} FunctionNamedBody {})
+ -> NamedFunction
+FunctionNamedBody
+ <- FUNCTION FuncName FuncArg
+ (!END Action)*
+ MaybeEnd
+FuncName <- (MustName (DOT MustName)* FuncMethod?)
+ -> Simple
+FuncMethod <- COLON Name / COLON {} -> MissMethod
]]
grammar 'Lua' [[