fix: do not allow negation of a positive int literal

This commit is contained in:
Gleb Koval 2025-02-02 13:30:33 +00:00
parent 2588c8287d
commit da4b398bf0
Signed by: cyclane
GPG Key ID: 15E168A8B332382C
2 changed files with 5 additions and 3 deletions

View File

@ -1,6 +1,7 @@
package wacc
import parsley.Parsley
import parsley.character
import parsley.token.{Basic, Lexer}
import parsley.token.descriptions.*
@ -45,6 +46,7 @@ object lexer {
private val lexer = Lexer(desc)
val ident = lexer.lexeme.names.identifier
val integer = lexer.lexeme.integer.decimal32[Int]
val negateCheck = lexer.nonlexeme.symbol("-") ~> character.digit
val charLit = lexer.lexeme.character.ascii
val stringLit = lexer.lexeme.string.ascii
val implicits = lexer.lexeme.symbol.implicits

View File

@ -2,7 +2,7 @@ package wacc
import parsley.Result
import parsley.Parsley
import parsley.Parsley.{atomic, many, pure}
import parsley.Parsley.{atomic, many, notFollowedBy, pure}
import parsley.combinator.{countSome, sepBy}
import parsley.expr.{precedence, SOps, InfixL, InfixN, InfixR, Prefix, Atoms}
import parsley.errors.combinator._
@ -11,7 +11,7 @@ import cats.data.NonEmptyList
object parser {
import lexer.implicits.implicitSymbol
import lexer.{ident, integer, charLit, stringLit}
import lexer.{ident, integer, charLit, stringLit, negateCheck}
import ast._
def parse(input: String): Result[String, Program] = parser.parse(input)
@ -32,7 +32,7 @@ object parser {
SOps(InfixL)(Mul from "*", Div from "/", Mod from "%") +:
SOps(Prefix)(
Not from "!",
Negate from "-",
Negate from (notFollowedBy(negateCheck) ~> "-"),
Len from "len",
Ord from "ord",
Chr from "chr"