From 9259fef2498433914a521565956635b283c1b5df Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Fri, 22 Mar 2019 02:01:48 -0400 Subject: [PATCH] tolerate spaces in numeric literals in line with the spec --- src/Language/SystemVerilog/Parser/Lex.x | 16 +++++++--------- src/Language/SystemVerilog/Parser/Preprocess.hs | 9 ++++++++- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Language/SystemVerilog/Parser/Lex.x b/src/Language/SystemVerilog/Parser/Lex.x index 08c7d5d..2bf837f 100644 --- a/src/Language/SystemVerilog/Parser/Lex.x +++ b/src/Language/SystemVerilog/Parser/Lex.x @@ -27,20 +27,18 @@ $decimalDigit = [0-9] @unsignedNumber = $decimalDigit ("_" | $decimalDigit)* -@size = @unsignedNumber +@size = @unsignedNumber " "? -@decimalNumber - = @unsignedNumber - | @size? @decimalBase @unsignedNumber - -@binaryNumber = @size? @binaryBase @binaryValue -@octalNumber = @size? @octalBase @octalValue -@hexNumber = @size? @hexBase @hexValue +@decimalNumber = @size? @decimalBase " "? @unsignedNumber +@binaryNumber = @size? @binaryBase " "? @binaryValue +@octalNumber = @size? @octalBase " "? @octalValue +@hexNumber = @size? @hexBase " "? @hexValue @unbasedUnsizedLiteral = "'" ( 0 | 1 | x | X | z | Z ) @number - = @decimalNumber + = @unsignedNumber + | @decimalNumber | @octalNumber | @binaryNumber | @hexNumber diff --git a/src/Language/SystemVerilog/Parser/Preprocess.hs b/src/Language/SystemVerilog/Parser/Preprocess.hs index 86cb801..69828df 100644 --- a/src/Language/SystemVerilog/Parser/Preprocess.hs +++ b/src/Language/SystemVerilog/Parser/Preprocess.hs @@ -24,7 +24,14 @@ unskippableDirectives :: [String] unskippableDirectives = ["else", "elsif", "endif"] preprocess :: [Token] -> (StateT PP IO) [Token] -preprocess tokens = pp tokens +preprocess tokens = pp tokens >>= return . combineNumbers + +-- a bit of a hack to allow things like: `WIDTH'b0 +combineNumbers :: [Token] -> [Token] +combineNumbers (Token Lit_number size pos : Token Lit_number ('\'' : num) _ : tokens) = + Token Lit_number (size ++ "'" ++ num) pos : combineNumbers tokens +combineNumbers (token : tokens) = token : combineNumbers tokens +combineNumbers [] = [] data Cond = CurrentlyTrue