Commit 89e4f2a2 by Zachary Snow

allow newlines before left paren of macro arguments

parent 81f5fb50
...@@ -485,35 +485,29 @@ takeChar = do ...@@ -485,35 +485,29 @@ takeChar = do
-- drop spaces in the input until a non-space is reached or EOF -- drop spaces in the input until a non-space is reached or EOF
dropSpaces :: Alex () dropSpaces :: Alex ()
dropSpaces = do dropSpaces = do
(_, _, _, str) <- alexGetInput
if null str || head str /= ' '
then return ()
else dropSpace >> dropSpaces
where
dropSpace :: Alex ()
dropSpace = do
(pos, _, _, str) <- alexGetInput (pos, _, _, str) <- alexGetInput
case str of case str of
' ' : rest -> do
alexSetInput (alexMove pos ' ', ' ', [], rest)
dropSpaces
[] -> return () [] -> return ()
' ' : rest -> alexSetInput (alexMove pos ' ', ' ', [], rest) _ -> return ()
ch : _ -> lexicalError $ "expected ' ', but found: " ++ show ch
isWhitespaceChar :: Char -> Bool isWhitespaceChar :: Char -> Bool
isWhitespaceChar ch = elem ch [' ', '\t', '\n'] isWhitespaceChar ch = elem ch [' ', '\t', '\n']
-- drop leading whitespace in the input -- drop all leading whitespace in the input
dropWhitespace :: Alex () dropWhitespace :: Alex ()
dropWhitespace = do dropWhitespace = do
(_, _, _, str) <- alexGetInput (pos, _, _, str) <- alexGetInput
if null str || not (isWhitespaceChar $ head str) case str of
then return () ch : chs ->
else dropChar >> dropWhitespace if isWhitespaceChar ch
where then do
dropChar :: Alex () alexSetInput (alexMove pos ch, ch, [], chs)
dropChar = do dropWhitespace
(pos, _, _, chs) <- alexGetInput else return()
let ch : rest = chs [] -> return ()
alexSetInput (alexMove pos ch, ch, [], rest)
-- removes and returns a quoted string such as <foo.bar> or "foo.bar" -- removes and returns a quoted string such as <foo.bar> or "foo.bar"
takeQuotedString :: Alex String takeQuotedString :: Alex String
...@@ -572,7 +566,7 @@ takeMacroDefinition = do ...@@ -572,7 +566,7 @@ takeMacroDefinition = do
-- "", except to delimit arguments or end the list of arguments; see 22.5.1 -- "", except to delimit arguments or end the list of arguments; see 22.5.1
takeMacroArguments :: Alex [String] takeMacroArguments :: Alex [String]
takeMacroArguments = do takeMacroArguments = do
dropSpaces dropWhitespace
leadCh <- takeChar leadCh <- takeChar
if leadCh == '(' if leadCh == '('
then argLoop then argLoop
......
`define FOO(a, b) ((a)+(b))
module top;
initial begin
$display(`FOO
(
1
,
2
));
end
endmodule
`include "macro_whitespace.sv"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment