Parsing C++ is getting hard. Parsing Java is getting to be just as hard.
看这个SO answer discussing why C (and C++) is "hard" to parse.简短的总结是C和C++ grammars本质上是含糊的;它们将为您提供多个解析,您可以使用上下文来解决歧义.然后,人们会错误地认为在解析时必须解决歧义;并非如此,见下文.如果你坚持在解析时解决歧义,你的解析器会变得更复杂,也更难构建;但这种复杂性是一种self 造成的伤害.
IIRC, Java 1.4's "obvious" LALR(1) grammar was not ambiguous, so it was "easy" to parse. I'm not so sure that modern Java hasn't got at least long distance local ambiguities; there's always the problem of deciding whether "...>>" closes off two templates or is a "right shift operator". I suspect modern Java does not parse with LALR(1) anymore.
但是,对于两种语言,可以通过使用强解析器(或弱解析器和上下文集合HAG作为C和C++前端来完成)来解决解析问题.
But parsing isn't really where the problem is.
解析之后,您将需要对AST/parse树进行一些操作.实际上,对于每个标识符,您都需要知道它的定义是什么,以及在哪里使用("名称和类型解析",草率地,构建符号表).事实证明,这比正确使用解析器要困难得多,其中包括继承、接口、重载和模板,而且所有这些的语义都是用非正式的自然语言编写的,跨越了语言标准的数十到数百页.这里的C++非常糟糕.从这个Angular 来看,Java7和Java8变得非常糟糕.(符号表并不是你所需要的全部;请参阅我的个人简历,以获得一篇关于"解析后的生活"的长篇文章).
大多数人都在为纯粹的解析部分而挣扎(通常永远不会完成;关于如何为真正的语言构建有效的解析器,有很多很多问题,请自己判断一下),所以他们永远看不到解析之后的生活.然后我们得到了一些民间定理,关于什么是很难解析的,并且没有信号表明在那个阶段之后会发生什么.
Fixing C++ syntax won't get you anywhere.个
关于改变C++语法:你会发现你需要修补很多地方来处理任何C++语法中的局部和真实模糊.如果你坚持,following list might be a good starting place美元.我认为如果你不是C++标准委员会,那么做这件事没有意义.如果你这么做了,并用它构建了一个编译器,没有人会理智地使用它.太多的投资在现有的C++应用程序中,为了便于构建解析器的人而切换;此外,他们的痛苦已经过go ,现有的解析器工作正常.
您可能希望编写自己的解析器.好的,那很好;只是不要指望社区的睡觉会让你改变他们必须使用的语言来让你更容易.他们都想让自己更轻松,那就是按照文档和实现的方式使用语言.