取消某些Haskell Alex / Happy编译消息

时间:2013-08-05 13:57:04

标签: haskell parser-generator happy alex

使用Alex lexer生成器或Happy解析器生成器创建Lexer.xParser.y解析器时,将这些解析器编译为Haskell文件,并将其编译为目标文件,默认情况下会生成以下“警告”:

$ ghc Lexer
line-map.c: file "<command-line>" left but not entered
line-map.c: file "<command-line>" left but not entered
[1 of 1] Compiling Lexer            ( Lexer.hs, Lexer.o )
$ happy Parser.y
$ ghc Parser
line-map.c: file "<command-line>" left but not entered
line-map.c: file "<command-line>" left but not entered
[2 of 2] Compiling Parser           ( Parser.hs, Parser.o )

这些行是由于生成的.hs文件中嵌入了以下行而导致的:

{-# LINE 1 "<command-line>" #-}

为什么包含这些行,并且有一种方法可以抑制这些消息,以防命令行显然没有用于生成的词法分析器和解析器中的任何内容?

1 个答案:

答案 0 :(得分:1)

谷歌搜索&#34;离开但未输入&#34;建议像这样的消息表明配置错误gcc。以下是Apple的版本中生成消息的代码:

void
linemap_check_files_exited (struct line_maps *set)
{
  struct line_map *map;
  /* Depending upon whether we are handling preprocessed input or
     not, this can be a user error or an ICE.  */
  for (map = &set->maps[set->used - 1]; ! MAIN_FILE_P (map);
       map = INCLUDED_FROM (set, map))
    fprintf (stderr, "line-map.c: file \"%s\" entered but not left\n",
         map->to_file);
}

(来自http://www.opensource.apple.com/source/gcc/gcc-5484/libcpp/line-map.c

这里&#34; ICE&#34;指内部编译器错误&#34;。

插入#LINE指令,以便ghc可以根据.x或.y文件中的位置报告错误。它表示以下行实际上是来自另一个文件的某一行。可以忽略伪文件名<command-line><built-in>的#LINE指令,因为它们后面紧跟着一个真实文件名的#LINE指令,例如:

...
{-# LINE 1 "<built-in>" #-}
{-# LINE 1 "<command-line>" #-}
{-# LINE 1 "templates/wrappers.hs" #-}
...
{-# LINE 1 "<built-in>" #-}
{-# LINE 1 "<command-line>" #-}
{-# LINE 1 "templates/GenericTemplate.hs" #-}
...

作为测试,您只需删除<command-line>的#LINE指令,并查看警告是否消失。我还会尝试重新安装/升级你的gcc和/或你的Haskell平台。