ANTLR4 - 如何中断

时间:2018-06-06 18:04:39

标签: antlr4

假设一条线的最大长度为5。 当换行符放在第5位时,我希望标识符能够继续。

的示例:

  • abcd'\ n'ef将导致单个标识符“abdef”
  • ab'\ n'def会导致标识符“ab”(和另一个“def”)

不知怎的,我无法让它发挥作用......

尝试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'符号仍然是标识符的一部分。不知怎的,当它在一条线的最后一个位置时,我没有成功地“忽略”换行符。

1 个答案:

答案 0 :(得分:0)

  

这似乎有效,但在解析器中处理时,'\ n'符号仍然是标识符的一部分。

这是因为NEWLINE仅在“独立”匹配时才会被跳过。只要它是另一条规则的一部分,例如Identifier,它就会成为所述规则的一部分。

IMO,你应该选择这个解决方案而不是为你的词法分析器(或解析器)添加太多的谓词。只需在解析后从Identifier中删除换行符。