Antlr4:语法-4 / javascript C ++端口问题

时间:2017-12-25 10:10:19

标签: c++ antlr antrl4

我正在尝试使用已经提供的C#和Java实现中使用的方法在C ++上移植语法-4 / javascript语法。 (https://github.com/antlr/grammars-v4/tree/master/javascript)。 首先,让我解释一下C#和Java实现如何为客户端提供生成的Lexer和Parser代码。例如,每个实现都定义了Lexer的基类 - JavaScriptBaseClass - 使用定义的方法NextToken()RegexPossible()等,它们自然地从Antlr Lexer类继承。语法文件JavaScriptLexer.g4JavaScriptBaseLexer定义为生成的词法分析器的超类。 同时,在基类JavaScriptLexer的已定义方法中使用仅在JavaScriptBaseClass源代码生成之后可用的一些实体。 例如,JavaScriptBaseLexer::NextToken方法使用OpenBrace枚举值来描述语法的一个标记。(https://github.com/antlr/grammars-v4/blob/a2b8cdfae4057f330f1ec46e8b8e87ea3e7ad962/javascript/CSharpSharwell/JavaScriptBaseLexer.cs#L68) 这是C#或Java的功能,不能预定义头文件,然后将它们包含在代码中,头文件中的名称可能出现在代码中。因此,在基类中使用尚未生成的JavaScriptLexer类源代码的字段是可以的。

但是如何在C ++实现中实现这一目标? 首先,生成的类必须知道其父类的定义,因此需要在生成的#include “JavaScriptBaseLexer.h”文件中显示指令JavaScriptLexer.h, 否则代码将无法编译,因为基类名称未定义。似乎lexer的选项header可以添加到lexer的语法文件中,

lexer::header {
  #include "JavaScriptBaseLexer.h"
}

但是这些选项不是特定于语言的,并且会出现在C#/ Java词法分析器生成的代码中,而这在C#/ Java代码中是不可能的。

其次,需要在源代码生成之前的某个地方定义JavaScriptLexer’s令牌枚举,以便在基类代码中使用。可以通过在JavaScriptLexer.h文件中包含生成的JavaScriptBaseLexer.cpp来解决此问题。看起来很奇怪......

如何在C ++中实现С#/ Java方法?我会感激任何帮助。 谢谢。

0 个答案:

没有答案