【问题标题】:Modifiying ANTLR v4 auto-generated lexer?修改 ANTLR v4 自动生成的词法分析器?
【发布时间】:2017-04-17 19:52:36
【问题描述】:

所以我正在编写一种小语言,并且我使用 antlrv4 作为我的工具。当你编译你的语法文件(.g4)时,Antlr 会自动生成词法分析器和解析器文件。我正在使用 javac 顺便说一句。我希望我的语言没有分号,我想要这样做的方式是:如果有一个标识符或“)”作为一行中的最后一个标记,词法分析器将自动放置分号(类似于什么“go”语言做)。我将如何处理这样的事情?在我不理解的词法分析器文件中还有其他一些东西,例如 ATN(我认为是增强转换网络)和 dfa(我认为是确定性有限自动机),或者它们与词法分析过程有何关系?任何帮助表示赞赏。 (顺便说一句,我仍在处理语法文件,所以我没有完全完成)。

【问题讨论】:

    标签: antlr javac lexer


    【解决方案1】:

    这里有几点:ATN 和 DFA 是解析器 + 词法分析器的内部结构,而不是您可以更改解析行为的东西。另外,我不清楚为什么要让词法分析器在某个时候插入分号。你到底想通过那个来完成什么(不要说:在解析器中使分号可选,我的意思是根本原因)。

    如果您想接受不带分号的命令,可以将其设为可选:

    assignment: simpleAssignment | complexAssignment SEMI?;
    

    无论是否有分号,解析器都会给你赋值规则的内容。这就是你想要的吗?

    【讨论】:

    • 我不想要分号,因为我相信它们主要用于解析器,对吧?我考虑了您的建议,使其在解析器语法中是可选的,但分号也标记了行或语句的结尾。例如:假设我有 print p5abc 而在下一行我有 print 10。解析器如何知道下一行中的 print 10 不是第一行字符串的一部分。即字符串不是 p5abcprint10 吗?通过自动添加分号,我可以在程序中省略它们的使用,同时仍然保留分号的功能?我希望这是有道理的。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2023-03-26
    相关资源
    最近更新 更多