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