我正在尝试使用已经提供的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.g4
将JavaScriptBaseLexer
定义为生成的词法分析器的超类。
同时,在基类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方法?我会感激任何帮助。 谢谢。