【问题标题】:ANTLR4 Assembler Language Parser - issues - miscellaneous commentsANTLR4 汇编语言解析器 - 问题 - 杂项评论
【发布时间】:2022-01-18 18:31:21
【问题描述】:

我正在尝试为 IBM 汇编语言编写解析器,示例如下。

注释行的第一个字符以星*开头,但是有两个问题

  1. 除了行中的设定点之外,还可以有描述性文字,但不需要星号*。

  2. 描述性可以/确实包含词法分析器标记,例如 ENTRY 或 INPUT.....

    *        TYPE.                                                          
    ARG      DSECT                                                           
    NXENT    DS    F                    some comment text ENTRY NUMBER             
    NMADR    DS    F                    some comment text INPUT NAME           
    NAADR    DS    F                    some comment text                    
    NATYP    DS    F                    some comment text           
    NAENT    DS    F                    some comment text          
             ORG   NATYP                some comment text                     
    

在我的词法分析器中,我设计了以下内容,绝对可以正常工作:

fragment CommentLine: Star {getCharPositionInLine() == 1}? .*? Nl 
   ;
fragment Star:                '*';
fragment Nl: '\r'? '\n' ;
COMMENT_LINE
   : CommentLine -> channel (COMMENT)
   ; 

我的问题是如何管理从解析器语法中特定字符位置开始的行 cmets? IE。解析器 -> 名称 DS INT?信??????????

【问题讨论】:

  • 汇编源代码是严格基于行的,对,所以我不会在这里使用完整的解析器。而是逐行拆分代码,然后按空格拆分每一行,然后处理各个标记。

标签: parsing antlr4 lexer


【解决方案1】:

将 cmets 发送到 COMMENT 通道(或 -> skiping 它们)是一种用于避免必须在解析器规则中定义所有 cmets 有效位置的技术。

(这里是 360+ 的老汇编程序员)

由于没有真正的方法可以将任意位置的 cmets 放置在 Assembler 源代码中,因此您实际上不需要将它们分流到一边。实际上,由于 cmets 在汇编源代码中的处理方式,没有办法在 Lexer 规则中识别它们。

由于它可以是解析器规则,因此您可以设置如下规则:

trailingComment: (ID | STRING | NUMBER)* EOL;

其中IDSTRINGNUMBER 等只是词法分析器中的标记(您需要包含几乎所有这些标记...对于MVCCLCCLI,(所有操作码...疯狂的路径)。当然,EOL 是匹配行尾的规则(可能是'\r?\n'

然后,您将使用 trailingComment 规则结束每个用于解析可能包含尾随注释(几乎所有注释)的行的规则。

【讨论】:

  • 感谢两位 Mikes 的回复......我不得不说这两个选项都不是特别有吸引力。我会走开去挠头。
  • 只是好奇......什么看起来没有吸引力?我实际上同意 Mike Lischke,顺便说一句。任何语法的上下文实际上只是一行(即没有语法可检测的程序结构,解析器会帮助处理(解析器不会给出一个语法树来告诉你任何真正有用的东西:程序结构。) ) 原谅双关语,但您确实必须通过遵循分支来“组装”程序结构,而且众所周知,汇编器是预结构的,因此不能真正保证它不会随意分支。只是野兽的本性。
猜你喜欢
  • 2014-02-23
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2013-11-17
相关资源
最近更新 更多