@@ -1002,7 +1002,7 @@ export const createParse = /* #__PURE__ */ factory(name, dependencies, ({
10021002 function parseAddSubtract ( state ) {
10031003 let node , name , fn , params
10041004
1005- node = parseMultiplyDivideModulusPercentage ( state )
1005+ node = parseMultiplyDivideModulus ( state )
10061006
10071007 const operators = {
10081008 '+' : 'add' ,
@@ -1013,7 +1013,7 @@ export const createParse = /* #__PURE__ */ factory(name, dependencies, ({
10131013 fn = operators [ name ]
10141014
10151015 getTokenSkipNewline ( state )
1016- const rightNode = parseMultiplyDivideModulusPercentage ( state )
1016+ const rightNode = parseMultiplyDivideModulus ( state )
10171017 if ( rightNode . isPercentage ) {
10181018 params = [ node , new OperatorNode ( '*' , 'multiply' , [ node , rightNode ] ) ]
10191019 } else {
@@ -1026,11 +1026,11 @@ export const createParse = /* #__PURE__ */ factory(name, dependencies, ({
10261026 }
10271027
10281028 /**
1029- * multiply, divide, modulus, percentage
1029+ * multiply, divide, modulus
10301030 * @return {Node } node
10311031 * @private
10321032 */
1033- function parseMultiplyDivideModulusPercentage ( state ) {
1033+ function parseMultiplyDivideModulus ( state ) {
10341034 let node , last , name , fn
10351035
10361036 node = parseImplicitMultiplication ( state )
@@ -1054,17 +1054,8 @@ export const createParse = /* #__PURE__ */ factory(name, dependencies, ({
10541054 getTokenSkipNewline ( state )
10551055
10561056 if ( name === '%' && state . tokenType === TOKENTYPE . DELIMITER && state . token !== '(' ) {
1057- // If the expression contains only %, then treat that as /100
1058- if ( state . token !== '' && operators [ state . token ] ) {
1059- const left = new OperatorNode ( '/' , 'divide' , [ node , new ConstantNode ( 100 ) ] , false , true )
1060- name = state . token
1061- fn = operators [ name ]
1062- getTokenSkipNewline ( state )
1063- last = parseImplicitMultiplication ( state )
1064-
1065- node = new OperatorNode ( name , fn , [ left , last ] )
1066- } else { node = new OperatorNode ( '/' , 'divide' , [ node , new ConstantNode ( 100 ) ] , false , true ) }
1067- // return node
1057+ // This % cannot be interpreted as a modulus, and it wasn't handled by parseUnaryPostfix
1058+ throw createSyntaxError ( state , 'Unexpected operator %' )
10681059 } else {
10691060 last = parseImplicitMultiplication ( state )
10701061 node = new OperatorNode ( name , fn , [ node , last ] )
@@ -1121,7 +1112,7 @@ export const createParse = /* #__PURE__ */ factory(name, dependencies, ({
11211112 * @private
11221113 */
11231114 function parseRule2 ( state ) {
1124- let node = parseUnary ( state )
1115+ let node = parseUnaryPercentage ( state )
11251116 let last = node
11261117 const tokenStates = [ ]
11271118
@@ -1144,7 +1135,7 @@ export const createParse = /* #__PURE__ */ factory(name, dependencies, ({
11441135 // Rewind once and build the "number / number" node; the symbol will be consumed later
11451136 Object . assign ( state , tokenStates . pop ( ) )
11461137 tokenStates . pop ( )
1147- last = parseUnary ( state )
1138+ last = parseUnaryPercentage ( state )
11481139 node = new OperatorNode ( '/' , 'divide' , [ node , last ] )
11491140 } else {
11501141 // Not a match, so rewind
@@ -1165,6 +1156,30 @@ export const createParse = /* #__PURE__ */ factory(name, dependencies, ({
11651156 return node
11661157 }
11671158
1159+ /**
1160+ * Unary percentage operator (treated as `value / 100`)
1161+ * @return {Node } node
1162+ * @private
1163+ */
1164+ function parseUnaryPercentage ( state ) {
1165+ let node = parseUnary ( state )
1166+
1167+ if ( state . token === '%' ) {
1168+ const previousState = Object . assign ( { } , state )
1169+ getTokenSkipNewline ( state )
1170+
1171+ if ( state . tokenType === TOKENTYPE . DELIMITER && state . token !== '(' ) {
1172+ // This is unary postfix %, then treat that as /100
1173+ node = new OperatorNode ( '/' , 'divide' , [ node , new ConstantNode ( 100 ) ] , false , true )
1174+ } else {
1175+ // Not a match, so rewind
1176+ Object . assign ( state , previousState )
1177+ }
1178+ }
1179+
1180+ return node
1181+ }
1182+
11681183 /**
11691184 * Unary plus and minus, and logical and bitwise not
11701185 * @return {Node } node
0 commit comments