使用Alex lexer生成器或Happy解析器生成器创建Lexer.x
或Parser.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>" #-}
为什么包含这些行,并且有一种方法可以抑制这些消息,以防命令行显然没有用于生成的词法分析器和解析器中的任何内容?
答案 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平台。