使用c#target时,“编译表达式太长或太复杂”

时间:2013-05-28 08:15:55

标签: c# antlr4

我今天早些时候终于得到了完整的语法,并遇到了“字符串太长”的Java问题。

我知道这个问题已经解决,但我害怕遇到其他限制所以我决定转而使用C#目标。我是一位经验丰富的C ++程序员,并且学习了Java以便能够使用Antlr4,切换到C#并不是什么大问题,只是一种新的学习方法。

我现在收到的消息是: 1> CSC:致命错误CS1647:表达式太长或太复杂而无法编译

没有提供其他信息。 有没有人在使用Antlr4生成的代码之前看过这个? 我在网上搜索了这条消息,但没有找到任何可以帮助的东西(许多引用了应该修复的旧错误)。

我的项目目前由一个.cs文件和2个.g4文件(词法分析器和解析器语法)组成。

语法非常复杂(实现IEEE标准中定义的语言)。

我最初使用Java目标实现了语法的一个子集而没有任何问题。

任何指针都表示赞赏。

以下是一些其他信息。我正在使用Visual Studio 2012。 它似乎与我最初看到的Java问题的版本相同。

我能够创建一个只包含以下行的示例C#文件:

public static readonly string _serializedATN =
    "\x5\x3\x176\x234A\x4\x2\t\x2\x4\x3\t\x3\x4\x4\t\x4\x4\x5\t\x5\x4\x6\t"+
    "\x6\x4\a\t\a\x4\b\t\b\x4\t\t\t\x4\n\t\n\x4\v\t\v\x4\f\t\f\x4\r\t\r\x4"+
    "\xE\t\xE\x4\xF\t\xF\x4\x10\t\x10\x4\x11\t\x11\x4\x12\t\x12\x4\x13\t\x13"+
    "\x4\x14\t\x14\x4\x15\t\x15\x4\x16\t\x16\x4\x17\t\x17\x4\x18\t\x18\x4\x19"+
    "\t\x19\x4\x1A\t\x1A\x4\x1B\t\x1B\x4\x1C\t\x1C\x4\x1D\t\x1D\x4\x1E\t\x1E"+
    "\x4\x1F\t\x1F\x4 \t \x4!\t!\x4\"\t\"\x4#\t#\x4$\t$\x4%\t%\x4&\t&\x4\'"+
    "\t\'\x4(\t(\x4)\t)\x4*\t*\x4+\t+\x4,\t,\x4-\t-\x4.\t.\x4/\t/\x4\x30\t"+
    "\x30\x4\x31\t\x31\x4\x32\t\x32\x4\x33\t\x33\x4\x34\t\x34\x4\x35\t\x35"+
                 ...
                 ...
                 "\x2316\x231E\x2324\x2328\x232D";

这个问题是可以重现的。该生产线长度超过4400行。 C#编译器似乎无法处理这么多concat。我试图避免从我的语言中删除关键字并使用它们创建哈希表。这可能是我目前唯一的解决方案。

1 个答案:

答案 0 :(得分:0)

我环顾了一下,发现这可能是由于编译器引发了“深度递归问题”。这意味着编译器因解析表达式太复杂而无法解析表达式。有关详情,请参阅Build error: "An expression is too long or complex to compile"http://ayende.com/blog/3528/setting-out-to-break-the-compiler