假设一条线的最大长度为5。 当换行符放在第5位时,我希望标识符能够继续。
的示例:
不知怎的,我无法让它发挥作用......
尝试1类似于:
NEWLINE1 : '\r'? '\n' { _tokenStartCharPositionInLine == 5 } -> skip;
NEWLINE2 : '\r'? '\n' { _tokenStartCharPositionInLine < 5 } -> channel(WHITESPACE);
Identifier : Letter (LetterOrDigit)*;
fragment
Letter : [a-zA-Z];
fragment
LetterOrDigit : [a-zA-Z0-9];
尝试2类似于:
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ -> channel(WHITESPACE);
Identifier : Letter (LetterOrDigit NEWLINE?)*;
NEWLINE: '\r'? '\n' { _tokenStartCharPositionInLine == 5}? -> skip;
fragment
Letter : [a-zA-Z];
fragment
LetterOrDigit : [a-zA-Z0-9];
这似乎有效,但在解析器中处理时,'\ n'符号仍然是标识符的一部分。不知怎的,当它在一条线的最后一个位置时,我没有成功地“忽略”换行符。
答案 0 :(得分:0)
这似乎有效,但在解析器中处理时,'\ n'符号仍然是标识符的一部分。
这是因为NEWLINE
仅在“独立”匹配时才会被跳过。只要它是另一条规则的一部分,例如Identifier
,它就会成为所述规则的一部分。
IMO,你应该选择这个解决方案而不是为你的词法分析器(或解析器)添加太多的谓词。只需在解析后从Identifier
中删除换行符。