From da4b398bf0bc15b5f39a9dca798812cd6e4ee618 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Sun, 2 Feb 2025 13:30:33 +0000 Subject: [PATCH] fix: do not allow negation of a positive int literal --- src/main/wacc/lexer.scala | 2 ++ src/main/wacc/parser.scala | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/wacc/lexer.scala b/src/main/wacc/lexer.scala index 4351294..094ac12 100644 --- a/src/main/wacc/lexer.scala +++ b/src/main/wacc/lexer.scala @@ -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 diff --git a/src/main/wacc/parser.scala b/src/main/wacc/parser.scala index 98e9484..84ee093 100644 --- a/src/main/wacc/parser.scala +++ b/src/main/wacc/parser.scala @@ -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"