CPP宏展开后的源码位置

问题描述 投票:0回答:1

我有以下包含 CPP 宏的 Haskell 文件。

#define FOO( x, y ) x ++ y

foo =
  FOO("a",
       "b"
       ++ "c")

bar = 1

当我对此文件调用

cpphs
时,我得到以下结果。

#line 1 "Test.hs"


foo =
  "a" ++ "b"
       ++ "c"

bar = 1

line 指令指出该指令后面的行是

1
的第
Test.hs
行。因此,
foo
仍位于第
3
行,而
bar
现在位于第
7
行,而它在原始文件中一直位于第
8
行。看起来逗号之后和第一个非空白标记之前的所有空白标记都被删除,从而丢失了原始换行符。我有以下问题。

  1. 这是预期的行为吗?
  2. 是否有任何我忽略的选项来插入行指令以正确修复
    bar
    的位置?
  3. 是否有任何其他预处理器可以通过使用行指令或其他方式来保留
    bar
    的位置?

我无法以任何方式更改文件的内容。

haskell preprocessor
1个回答
0
投票

您必须为输入文件编写自己的简单预处理器,您的预处理器将在每行之前插入行指令。

输入:

#define FOO( x, y ) x ++ y

foo =
  FOO("a",
       "b"
       ++ "c")

bar = 1

输出:

#line 1
#define FOO( x, y ) x ++ y
#line 2

#line 3
foo =
#line 4
  FOO("a",
#line 5
       "b"
#line 6
       ++ "c")
#line 7

#line 8
bar = 1

然后这个输出可以传递给

cpphs
。你会得到你想要的但相当冗长的结果。

#line 1 "Test.hs"

#line 2 "Test.hs"

#line 3 "Test.hs"
foo =
#line 4 "Test.hs"
#line 5 "Test.hs"
  "a" ++ "b"
#line 6 "Test.hs"
       ++ "c"
#line 7 "Test.hs"

#line 8 "Test.hs"
bar = 1
© www.soinside.com 2019 - 2024. All rights reserved.