关于换行符:语法通过转义(忽略)继续符号来在下一行继续标记(即ID)

您所在的位置:网站首页 java里的换行符 关于换行符:语法通过转义(忽略)继续符号来在下一行继续标记(即ID)

关于换行符:语法通过转义(忽略)继续符号来在下一行继续标记(即ID)

2022-12-23 02:40| 来源: 网络整理| 查看: 265

IBM i控制语言(CL)语句以\ (换行符)终止,并使用+\ 或-\ 在下一行继续长的语句(-在下一行的位置1继续, +在下一行继续第一个非空白字符)。在本书中,我使用了ANTLR4 RC1"有趣的Python换行符"示例,该示例非常匹配,并且只要+或-连续字符不分割标记文本,它就可以正常工作。例如,这在CL:

中有效

12345    chg+                                                       var +                                                     &x (&-                                                 x++                                                            1) /*"Change variable" statement resulting in: chgvar &X (&X+1) */

-或-

12    chgvar &y (&a || 'some +     stuff') /* result: chgvar &y (&a || 'some stuff') */

这是一个简单的测试装备的语法,仅支持ID和-作为换行符:

注意:基于lexmagic / SimplePy.g4

1234567891011    grammar CL;     pgm       :   stat+ EOF ;     stat      :   ID NEWLINE ;     ID        :   [a-zA-Z_] [a-zA-Z_0-9]* ;     NEWLINE   :   '\ '? '\ ' ;     WS        :   [ \\t]+ -> skip ;     LINE_ESC  :   '-' '\ '? '\ ' -> skip ;

这是运行它的方法(在终端中需要所有导出和别名之后):

12345678    antlr4 CL.g4     javac *.java     grun CL pgm -tree     abc- (Return once)     def (Return, CTRL-D)     line 2:0 extraneous input 'def' expecting NEWLINE     (pgm (stat abc def \ ) )

ANTLR4将ID视为两个标记abc,def而不是abcdef,而且我理解为什么(当Lexer看到-\ 时,它为abc发出ID标记,丢弃-\ 并以def开头作为新令牌。)。解析器看到abc def\ 而不是abcdef\ 。

问题是,有没有办法让解析器将abc-\ def\ 视为一个令牌而不是两个令牌?

另一方面,如果源代码= abc -\ def\ ,则由于abc和-\ 之间的空间,它应合法地发出2个令牌。

相关讨论 为了更容易区分代码和描述,应使用"堆栈溢出"代码格式。内联代码可以使用反引号(`),而代码块则可以在一行的开头使用4个空格。这将使您更容易理解您想说的内容。我从编辑开始(可能正在等待批准),但是由于我不太了解该代码,因此您需要先完成它。

我倾向于使用自定义的CharStream实现对词法分析器隐藏连续字符,该词法与标准流一样工作,除了:

对于正数i和负数i,IntStream.LA(i)的实现都需要跳过连续字符。 IntStream.consume的实现需要在必要时跳过隐藏区域,即在使用常规的consume实现之后,如果接下来的两个字符是-\ 或+\ ,则立即将索引移到跳过的字符之外。 IntStream.seek的实现需要确保索引留在可见字符上(有关更多信息,请参见Javadocs)。

CharStream.getText的实现应返回指定间隔中的文本,并从结果中去除不可见的连续字符。

IntStream.mark,IntStream.release,IntStream.index,IntStream.size和IntStream.getSourceName的实现不需要任何特殊的内容。

由于词法分析器不会看到每个输入符号,因此您可能需要执行其他步骤以确保与令牌关联的行号和列号正确。

相关讨论 感谢您的详细回答,您的策略很有道理。但是,我不是Java程序员,但我会尝试一下(一旦我能弄清楚从哪里开始,呵呵)。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3