Skip to content

Commit

Permalink
feat: 校正st相关语法,同时增加测试
Browse files Browse the repository at this point in the history
  • Loading branch information
fy0 committed Jun 7, 2024
1 parent 521b2cf commit e4ddd15
Show file tree
Hide file tree
Showing 7 changed files with 748 additions and 438 deletions.
118 changes: 59 additions & 59 deletions roll.peg
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ stmtContinue <- "continue" sp {
stmtReturn <- "return" sp1x exprRoot { c.data.AddOp(typeReturn); }
/ "return" sp { c.data.PushNull(); c.data.AddOp(typeReturn); }

stmtWhile <- "while" { c.data.LoopBegin(); c.data.OffsetPush() } sp1x exprRoot { c.data.AddOp(typeJne); c.data.OffsetPush() }
stmtWhile <- "while" { c.data.LoopBegin(); c.data.OffsetPush() } sp1x exprRoot sp { c.data.AddOp(typeJne); c.data.OffsetPush() }
block { c.data.AddOp(typeJmp); c.data.OffsetPush(); c.data.OffsetJmpSetX(0, 2, true); c.data.OffsetJmpSetX(1, 1, false); c.data.ContinueSet(2); c.data.BreakSet(); c.data.OffsetPopN(3);c.data.LoopEnd(); }
// push xxx // 这里是while后面的exprRoot
// jne 1
Expand All @@ -93,7 +93,7 @@ stmtWhile <- "while" { c.data.LoopBegin(); c.data.OffsetPush() } sp1x exprRoot {

block <- ( '{' sp '}' / '{' sp stmtRoot '}' ) sp
stmtElse <- "else" (sp block / sp1x stmtIf)
stmtIf <- "if" sp1x exprRoot { c.data.AddOp(typeJne); c.data.OffsetPush() } block { c.data.AddOp(typeJmp); c.data.OffsetPopAndSet(); c.data.OffsetPush(); }
stmtIf <- "if" sp1x exprRoot sp { c.data.AddOp(typeJne); c.data.OffsetPush() } block { c.data.AddOp(typeJmp); c.data.OffsetPopAndSet(); c.data.OffsetPush(); }
stmtElse? { c.data.OffsetPopAndSet(); }

// 'if' exprRoot block
Expand Down Expand Up @@ -134,10 +134,10 @@ stmtAssign <- &stmtAssignType1 stmtAssignType1

// exprRoot <- exprSlice sp
nestedBoost <- &(subX sp [-+*/%^dDcCaA&|?<>=]) exprSlice / &subX subX
exprRoot <- (nestedBoost / exprSlice) sp
exprRoot <- (nestedBoost / exprSlice)

_step <- (':' sp (exprRoot / sp { c.data.PushNull() }) / sp { c.data.PushNull() })
_sliceSuffix <- '[' sp (exprRoot / sp { c.data.PushNull() }) ':' sp (exprRoot / sp { c.data.PushNull() }) _step ']' sp
_sliceSuffix <- '[' sp (exprRoot / sp { c.data.PushNull() }) ':' sp (exprRoot / sp { c.data.PushNull() }) _step sp ']' sp

exprSliceType1 <- exprTernary _sliceSuffix (!'=') { c.data.AddOp(typeSliceGet) }
exprSlice <- &exprSliceType1 exprSliceType1
Expand Down Expand Up @@ -166,46 +166,46 @@ exprTernary <- &exprTernaryType1 exprTernaryType1
// 注: 越靠下的算符优先级越高

// 逻辑运算
exprLogicOr <- exprLogicAnd sp (logicOr {c.data.AddOp(typeJeDup); c.data.OffsetPush()} exprLogicAnd { c.data.AddOp(typeJeDup); c.data.OffsetPush()} { c.data.AddOp(typePushLast); c.data.OffsetPopAndSet(); c.data.OffsetPopAndSet(); } )*
exprLogicAnd <- exprBitwiseOr sp (logicAnd exprBitwiseOr { c.data.AddOp(typeLogicAnd) } )*
exprLogicOr <- exprLogicAnd (sp logicOr {c.data.AddOp(typeJeDup); c.data.OffsetPush()} exprLogicAnd { c.data.AddOp(typeJeDup); c.data.OffsetPush()} { c.data.AddOp(typePushLast); c.data.OffsetPopAndSet(); c.data.OffsetPopAndSet(); } )*
exprLogicAnd <- exprBitwiseOr (sp logicAnd exprBitwiseOr { c.data.AddOp(typeLogicAnd) } )*

// 位运算
exprBitwiseOr <- &{return c.data.Config.DisableBitwiseOp} exprCompare // 如果禁止,那么直接向下
/ exprBitwiseAnd sp (bitwiseOr exprBitwiseAnd { c.data.AddOp(typeBitwiseOr) })*
exprBitwiseAnd <- exprCompare sp (bitwiseAnd exprCompare { c.data.AddOp(typeBitwiseAnd) })*
/ exprBitwiseAnd (sp bitwiseOr exprBitwiseAnd { c.data.AddOp(typeBitwiseOr) })*
exprBitwiseAnd <- exprCompare (sp bitwiseAnd exprCompare { c.data.AddOp(typeBitwiseAnd) })*


// 比较
exprCompare <- exprAdditive sp (
exprCompare <- exprAdditive (sp (
lt exprAdditive { c.data.AddOp(typeCompLT) }
/ le exprAdditive { c.data.AddOp(typeCompLE) }
/ eq exprAdditive { c.data.AddOp(typeCompEQ) }
/ ne exprAdditive { c.data.AddOp(typeCompNE) }
/ ge exprAdditive { c.data.AddOp(typeCompGE) }
/ gt exprAdditive { c.data.AddOp(typeCompGT) }
)*
))*

// 加减
exprAdditive <- exprMultiplicative sp (
exprAdditive <- exprMultiplicative (sp (
add exprMultiplicative { c.data.AddOp(typeAdd) }
/ minus exprMultiplicative { c.data.AddOp(typeSubtract) }
)*
))*

// 乘除余
exprMultiplicative <- exprNullCoalescing sp (
exprMultiplicative <- exprNullCoalescing (sp (
multiply exprExp { c.data.AddOp(typeMultiply) }
/ divide exprExp { c.data.AddOp(typeDivide) }
/ modulus exprExp { c.data.AddOp(typeModulus) }
)*
))*

// 空值合并
exprNullCoalescing <- exprExp sp (
nullCoalescing exprExp { c.data.AddOp(typeNullCoalescing) }
exprNullCoalescing <- exprExp (
sp nullCoalescing exprExp { c.data.AddOp(typeNullCoalescing) }
)*

// 平方
exprExp <- exprUnaryNeg sp (
exponentiation exprUnaryNeg { c.data.AddOp(typeExponentiation) }
exprExp <- exprUnaryNeg (
sp exponentiation exprUnaryNeg { c.data.AddOp(typeExponentiation) }
)*

// 正数 负数
Expand Down Expand Up @@ -281,7 +281,7 @@ exprDice <- &_diceType1 detailStart nos _diceExpr1 detailEnd { c.data.AddOp(type

array_call <- "kh" { c.data.WriteCode(typeGetAttr, string("kh")) } (number { c.data.AddInvoke(1) } / {c.data.AddInvoke(0)})
/ "kl" { c.data.WriteCode(typeGetAttr, string("kl")) } (number { c.data.AddInvoke(1) } / {c.data.AddInvoke(0)})
/ ('[' sp exprRoot ']' sp { c.data.AddOp(typeItemGet) })+
/ ('[' sp exprRoot sp ']' sp { c.data.AddOp(typeItemGet) })+

// TODO: value 中的 item_get attr_get 连写这种形式处理的很烂,之后改掉

Expand All @@ -292,8 +292,8 @@ item_get <- (&&(item_getX) item_getX)?
attr_getX <- ('.' (sp id:identifier sp { c.data.WriteCode(typeGetAttr, id.(string)) }) func_invoke? )*
attr_get <- (&&attr_getX attr_getX)?

func_invoke <- '(' sp ')' sp { c.data.AddInvoke(0) }
/ '(' sp { c.data.CounterPush(); c.data.CounterAdd(1) } exprRoot (',' sp exprRoot {c.data.CounterAdd(1)} )* ')' sp { c.data.AddInvoke(c.data.CounterPop()) }
func_invoke <- '(' sp ')' { c.data.AddInvoke(0) }
/ '(' sp { c.data.CounterPush(); c.data.CounterAdd(1) } exprRoot sp (',' sp exprRoot {c.data.CounterAdd(1)} )* sp ')' { c.data.AddInvoke(c.data.CounterPop()) }

dict_item <- ((value_id_without_colon / exprRoot) sp ':' sp exprRoot) sp { c.data.CounterAdd(1) }

Expand Down Expand Up @@ -338,8 +338,8 @@ fstring <- (
/ ('\x1e' '\x1e' { c.data.PushStr("") })
/ ('"' '"' { c.data.PushStr("") })
/ ('`' '`' { c.data.PushStr("") })
/ ('`' { c.data.CounterPush() } ( ('{' sp exprRoot {c.data.CounterAdd(1)} '}') / ("{%" sp exprRoot {c.data.CounterAdd(1)} "%}") / strPart )* '`' { c.data.AddFormatString(c.data.CounterPop()) })
/ ('\x1e' { c.data.CounterPush() } ( ('{' sp exprRoot {c.data.CounterAdd(1)} '}') / ("{%" sp exprRoot {c.data.CounterAdd(1)} "%}") / strPart1 )* '\x1e' { c.data.AddFormatString(c.data.CounterPop()) }) // 特殊标记 0x1E
/ ('`' { c.data.CounterPush() } ( ('{' sp exprRoot {c.data.CounterAdd(1)} sp '}') / ("{%" sp exprRoot {c.data.CounterAdd(1)} sp "%}") / strPart )* '`' { c.data.AddFormatString(c.data.CounterPop()) })
/ ('\x1e' { c.data.CounterPush() } ( ('{' sp exprRoot {c.data.CounterAdd(1)} sp '}') / ("{%" sp exprRoot {c.data.CounterAdd(1)} sp "%}") / strPart1 )* '\x1e' { c.data.AddFormatString(c.data.CounterPop()) }) // 特殊标记 0x1E
/ ('"' { c.data.CounterPush() } strPart2* '"' { c.data.CounterPop() })
/ ('\'' { c.data.CounterPush() } strPart3* '\'' { c.data.CounterPop() } )
) sp
Expand Down Expand Up @@ -426,57 +426,57 @@ commentLineRest2 <- (![\r\n] .)* [\r\n]

st_expr <- st_modify_multi_1
/ st_assign_multi
/ st_modify_multi_2

// est <- eDice / &'(' ? e0
// est <- e0
e0 <- stmtRoot
est <- ( &'(' e0 )
/ &e0 { c.data.FlagsPush(); c.data.Config.DisableStmts = true; c.data.Config.DisableNDice = true} e0 { c.data.FlagsPop() }
est <- ( &'(' exprRoot )
/ &exprRoot {
c.data.FlagsPush()
c.data.Config.DisableStmts = true
c.data.Config.DisableNDice = true
c.data.Config.DisableBitwiseOp = true
} exprRoot { c.data.FlagsPop() }

st_assign_multi <- (st_assign sp ','? sp)+

st_star <- '*' sp (float / number / sub)
st_assign <- st_name2 sp (':' / '=') sp est { c.data.AddStName() } // 射击:弓箭:40 / 射击:弓箭40
/ st_name1 est { c.data.AddStName() } // 测试:力量60
/ st_name2r sp st_star sp (':' / '=') sp est { c.data.AddOp(typeStX1) } // 属性2*2.0: 5
/ st_name2r sp '*' sp (':' / '=') sp est { c.data.AddOp(typeStX0) } // 属性*: 4
/ st_name2r sp (':' / '=') sp est { c.data.AddStName() } // 属性2: 70
/ st_name1r est { c.data.AddStName() } // 力量60
/ '&' st_name2 sp (':' / '=') sp { c.data.CodePush() } text:< est > { c.data.CodePop(); c.data.AddStoreComputedOnStack(text.(string)); c.data.AddStName() } // &手枪 = 1d4
/ '&' st_name2r sp (':' / '=') sp { c.data.CodePush() } text:< est > { c.data.CodePop(); c.data.AddStoreComputedOnStack(text.(string)); c.data.AddStName() } // &手枪 = 1d4
st_assign <- &(st_name2 sp (':' / '=') sp est) st_name2 sp (':' / '=') sp est { c.data.AddStName() } // 射击:弓箭:40 / 射击:弓箭40
/ &(st_name1 est) st_name1 est { c.data.AddStName() } // 测试:力量60
/ &(st_name2r sp st_star sp (':' / '=') sp est) st_name2r sp st_star sp (':' / '=') sp est { c.data.AddOp(typeStX1) } // 属性2*2.0: 5
/ &(st_name2r sp '*' sp (':' / '=') sp est) st_name2r sp '*' sp (':' / '=') sp est { c.data.AddOp(typeStX0) } // 属性*: 4
/ &(st_name2r sp (':' / '=') sp est) st_name2r sp (':' / '=') sp est { c.data.AddStName() } // 属性2: 70
/ &(st_name1r est) st_name1r est { c.data.AddStName() } // 力量60
/ &('&' st_name2 sp (':' / '=') est) '&' st_name2 sp (':' / '=') sp { c.data.CodePush(); } text:< est > { c.data.AddStoreComputedOnStack(text.(string)); c.data.AddStName() } // &手枪 = 1d4
/ &('&' st_name2r sp (':' / '=') est) '&' st_name2r sp (':' / '=') sp {c.data.CodePush(); } text:< est > { c.data.AddStoreComputedOnStack(text.(string)); c.data.AddStName() } // &手枪 = 1d4

// 第一类:
// 力量+1d3
// 力量123+=1d3
st_modify_multi_1 <- ((st_name2 st_modify_rest1 / st_name2r st_modify_rest1 / st_name1 st_modify_rest / st_name1r st_modify_rest) sp ','? sp ) st_modify_multi_rest

st_modify_rest1 <- sp (
"+=" sp text:< e0 > {c.data.AddStModify("+", text.(string))} /
"-=" sp text:< e0 > {c.data.AddStModify("-", text.(string))}
)
// 力量123+=1d3 // 这种语法已经不支持,原因忘记了
// '力量123'+=1d3
st_modify_multi_1 <- (st_modify_lead sp ','? sp) st_modify_multi_rest

// 第二类,在第一种基础上增加:
// 力量123+1d3
st_modify_lead <- &(st_name2 st_modify_rest1) st_name2 st_modify_rest1
/ &(st_name2r st_modify_rest1) st_name2r st_modify_rest1
/ &(st_name1 st_modify_rest) st_name1 st_modify_rest
/ &(st_name1r st_modify_rest) st_name1r st_modify_rest

st_modify_multi_2 <- (st_modify2 sp ','? sp) st_modify_multi_rest
st_modify_multi_rest <- (st_modify_lead sp ','? sp)*

st_modify_multi_rest <- (st_modify2 sp ','? sp)*
st_modify2 <- st_name2 st_modify_rest
/ st_name2r st_modify_rest
st_modify_rest1 <- sp (
"+=" sp text:< exprRoot > {c.data.AddStModify("+", text.(string))} /
"-=" sp text:< exprRoot > {c.data.AddStModify("-", text.(string))}
)

st_modify_rest <- sp (
'+' '='? sp text:< e0 > {c.data.AddStModify("+", text.(string))} /
&( '-' ) sp text:< e0 > {c.data.AddStModify("-", text.(string))} /
'-' '='? sp text:< e0 > {c.data.AddStModify("-", text.(string))}
'+' '='? sp text:< exprRoot > {c.data.AddStModify("+", text.(string))} /
'-' '='? sp text:< exprRoot > {c.data.AddStModify("-", text.(string))}
/// &( '-' ) sp text:< exprRoot > {c.data.AddStModify("-", text.(string))} /
)

st_name1 <- text:<( id_ch0+ ":" id_ch0+ )> { c.data.PushStr(text.(string)) } // 结尾不带数字
st_name1r <- text: <( id_ch0+ )> { c.data.PushStr(text.(string)) } // 结尾不带数字
st_name1 <- text:<( id_ch+ ":" id_ch+ )> { c.data.PushStr(text.(string)) } // 结尾不带数字
st_name1r <- text: <( id_ch+ )> { c.data.PushStr(text.(string)) } // 结尾不带数字
/ '\'' text:< (id_ch / [0-9] / ' ' / ':')+ > '\'' { c.data.PushStr(text.(string)) } // 任意字符,需要框起来

st_name2 <- text:<( id_ch0 id_ch* (':' id_ch+) )> { c.data.PushStr(text.(string)) } // 结尾可带数字,即常规变量名
st_name2r <- text:<( id_ch0 id_ch* )> { c.data.PushStr(text.(string)) } // 结尾可带数字,即常规变量名
/ '\'' text:< (id_ch0 / [0-9] / ' ' / ':')+ > '\'' { c.data.PushStr(text.(string)) } // 任意字符
st_name2 <- st_name1 // 目前和1一样,占位符
st_name2r <- text:<( id_ch+ )> { c.data.PushStr(text.(string)) } // 结尾可带数字,即常规变量名
/ '\'' text:< (id_ch / [0-9] / ' ' / ':')+ > '\'' { c.data.PushStr(text.(string)) } // 任意字符

id_ch0 <- xidStart
id_ch <- xidStart
Loading

0 comments on commit e4ddd15

Please sign in to comment.