如何在 ANTLR4 中测试我的解析器语法?

How do I test out my parser grammar in ANTLR4?

提问人:Dj Sushi 提问时间:10/27/2023 更新时间:10/27/2023 访问量:56

问:

我在 ANTLR4 中编写了一个解析器语法,如下所示:

parser grammar IFJ23;

tokens {
    Identifier, Type,
    LeftBracket, RightBracket,
    LeftCurlyBracket, RightCurlyBracket,
    Semicolon, Colon, Arrow, Comma,

    /** Keywords */
    FunctionKeyword
}

swiftFile
    : functionDeclaration swiftFile
    ;



/** Statements */
statement
    : declaration Semicolon?
    ;

statements
    : statement statements?
    ;

codeBlock
    : LeftCurlyBracket statements? RightCurlyBracket
    ;



/** Declarations */
declaration
    : functionDeclaration
//    | variableDeclaration
    ;



/** Function declarations */
functionDeclaration
    : FunctionKeyword Identifier functionSignature functionBody
    ;

functionSignature
    : parameterClause functionResult?
    ;

functionBody
    : codeBlock
    ;

parameterClause
    : LeftBracket RightBracket
    | LeftBracket parameterList RightBracket
    ;

functionResult
    : Arrow Type
    ;

parameterList
    : parameter
    | parameter Comma parameterList
    ;

parameter
    : externalParameterName? localParameterName typeAnnotation
    ;

externalParameterName
    : Identifier
    ;

localParameterName
    : Identifier
    ;

typeAnnotation
    : Colon Type
    ;

现在,我面临的问题是我已经有一个不是用 ANTLR4 编写的功能词法分析器。它是用 C 语言编写的,它为文件生成一个标记列表。

有没有办法以某种方式让 ANTLR4 接受此令牌列表作为输入并尝试生成解析树?

我还需要将列表中的标记与从词法分析器生成的相应标记类型进行匹配。Tokens {}

解析 令牌 ANTLR ANTLR4 词法分析器

评论

0赞 Bart Kiers 10/28/2023
从这两种语法来看,词法分析器语法更容易实现。我很确定在 ANTLR 中重写词法分析器语法比尝试让另一个词法分析器与 ANTLR 解析器合作要少得多。
0赞 Dj Sushi 10/28/2023
@BartKiers感谢您的回复。我想你已经说服了我......问题是,我们只有一张正在使用的有限自动机的图。有没有一些推荐的方法可以将这个自动机转换为ANTLR词法分析器的一组规则?
0赞 kaby76 10/28/2023
(1) 具体到提到的测试场景,Antlr 工具包中没有任何东西可以使用不同的词法分析器或读取令牌列表作为输入并将它们包装在令牌流中。但是,您可以通过编写一个专门的令牌流来调用您的词法分析器而不是 github.com/antlr/antlr4/blob/...,从而轻松做到这一点。
0赞 kaby76 10/28/2023
(2) 从 NFA 到正则表达式很容易,但将其转换为具有每个标记的单独词法分析器规则的 Antlr 词法分析器语法并不容易。这是因为 Antlr 词法分析器规则遵循 (a) 最长匹配,然后 (b) 第一个规则匹配。除非你对此非常熟悉,否则我只会写一个单规则词法分析器语法。
0赞 Dj Sushi 10/28/2023
@kaby76感谢您的评论。所以从本质上讲,你的建议是首先将我的NFA转换为正则表达式,然后编写一个包含这个正则表达式的词法分析器规则?我的问题是,根据我的 NFA 停止的位置(最终状态),它会输出不同的代币类型(例如,、、...)。我在解析器中使用这些令牌类型。创建单个词法分析器规则是否能够生成在文件中的声明中指定的所有这些不同的令牌类型?WhileKeywordIdentifierDoubletokens.g4

答: 暂无答案