修改ANTLR v4自动生成的lexer?

修改ANTLR v4自动生成的lexer?,antlr,javac,lexer,Antlr,Javac,Lexer,因此,我正在编写一种小型语言,并使用antlrv4作为我的工具。在编译语法文件(.g4)时,Antlr会自动生成lexer和parser文件。我使用的是javac btw。我希望我的语言没有分号,我希望这样做的方式是:如果有一个标识符或“)”作为行中的最后一个标记,lexer将自动放置分号(类似于“go”语言所做的)。我将如何处理这样的事情?在lexer文件中还有其他一些东西,比如ATN(我认为是增强的过渡网络)和dfa(我认为是确定性有限自动机),我不理解它们与lexing过程的关系?。感谢您

因此,我正在编写一种小型语言,并使用antlrv4作为我的工具。在编译语法文件(.g4)时,Antlr会自动生成lexer和parser文件。我使用的是javac btw。我希望我的语言没有分号,我希望这样做的方式是:如果有一个标识符或“)”作为行中的最后一个标记,lexer将自动放置分号(类似于“go”语言所做的)。我将如何处理这样的事情?在lexer文件中还有其他一些东西,比如ATN(我认为是增强的过渡网络)和dfa(我认为是确定性有限自动机),我不理解它们与lexing过程的关系?。感谢您的帮助。(顺便说一句,我仍在处理语法文件,所以还没有完全完成)。

这里有几点:ATN和DFA是parser+lexer的内部结构,而不是用来改变解析行为的东西。另外,我也不清楚为什么要让lexer在某个点插入分号。您希望通过这种方式实现什么(不要说:在解析器中使分号成为可选的,我指的是潜在的原因)

如果要接受不带尾随分号的命令,可以将其设置为可选:

assignment: simpleAssignment | complexAssignment SEMI?;

解析器将为您提供赋值规则的内容,而不管后面是否有分号。这就是你想要的吗?

我不想要分号,因为我认为分号主要用于解析器,对吗?我考虑了u的建议,在解析器语法中它是可选的,但分号也标记行或语句的结尾。例如:假设我有打印p5abc,而在下一行我有打印10。解析器如何知道下一行中的print 10不是第一行字符串的一部分。i、 这个字符串不是p5abcprint10吗?通过自动添加分号,我可以在保留分号功能的同时在程序中省略它们的用法?我希望这是有道理的(