From fea5ff44eb23d557a42bf09b4cdbebf18e2d44f4 Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Fri, 11 Oct 2019 22:53:08 -0400 Subject: [PATCH] coalesce tokens across nested macros --- src/Language/SystemVerilog/Parser/Lex.x | 10 +++++++++- test/lex/macro_boundary.sv | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Language/SystemVerilog/Parser/Lex.x b/src/Language/SystemVerilog/Parser/Lex.x index e3f03e8..7818778 100644 --- a/src/Language/SystemVerilog/Parser/Lex.x +++ b/src/Language/SystemVerilog/Parser/Lex.x @@ -540,7 +540,9 @@ lexFile includePaths env path = do (show $ length $ lsSpecStack finalState) else Right (finalToks, lsEnv finalState) - where finalToks = coalesce $ reverse $ lsToks finalState + where + finalToks = coalesce $ combineBoundaries $ + reverse $ lsToks finalState where setEnv = do modify $ \s -> s @@ -569,6 +571,12 @@ coalesce (Token t1 str1 pn1 : Token MacroBoundary _ _ : Token t2 str2 pn2 : rest immediatelyFollows = apn2 == foldl alexMove apn1 str1 coalesce (x : xs) = x : coalesce xs +combineBoundaries :: [Token] -> [Token] +combineBoundaries [] = [] +combineBoundaries (Token MacroBoundary s p : Token MacroBoundary _ _ : rest) = + combineBoundaries $ Token MacroBoundary s p : rest +combineBoundaries (x : xs) = x : combineBoundaries xs + -- invoked by alexMonadScan alexEOF :: Alex () alexEOF = return () diff --git a/test/lex/macro_boundary.sv b/test/lex/macro_boundary.sv index d4daa1f..dd7ef36 100644 --- a/test/lex/macro_boundary.sv +++ b/test/lex/macro_boundary.sv @@ -1,5 +1,7 @@ `define SIZE 4 +`define NESTED_SIZE `SIZE `define NAME op module t`NAME; initial $display(`SIZE'ha); + initial $display(`NESTED_SIZE'ha); endmodule