使用 antlr4 进行条件解析 - 跳过输入
conditional parsing with antlr4 - skip the input
我有一个字符串要使用 antlr4 解析,如果特定输入在字符串中匹配,我需要跳过一个标记。
例如,一个字符串包含如下数字和字符串:
String = "87uuujdhhfj12ooiik56iijtg40jhdksa";
解析输出:
87 uuujdhhfj
12 ooiik56iijtg //here 56 is skipped
40 jhdksa
如果字符串在解析时匹配 12,那么我需要在解析时跳过接下来的 12 个(12 以外的任何值都可以)字符。
对此类解析的任何参考或代码都会有所帮助。
在词法分析器中处理这个需要 predicate:
lexer grammar TLexer;
@members {
int charsToConsume = 0;
}
TOKEN
: ( {charsToConsume-- > 0}? [a-zA-Z0-9] )+
| [a-zA-Z]+
;
INT
: [0-9]+ {
int n = Integer.parseInt(getText());
if (n == 12) {
this.charsToConsume = 12;
}
}
;
您 运行 与 class:
import org.antlr.v4.runtime.*;
public class Main {
public static void main(String[] args) {
String source = "87uuujdhhfj12ooiik56iijtg40jhdksa";
TLexer lexer = new TLexer(CharStreams.fromString(source));
CommonTokenStream tokens = new CommonTokenStream(lexer);
tokens.fill();
for (Token t : tokens.getTokens()) {
System.out.printf("%-15s '%s'\n", TLexer.VOCABULARY.getSymbolicName(t.getType()), t.getText());
}
}
}
并将打印:
INT '87'
TOKEN 'uuujdhhfj'
INT '12'
TOKEN 'ooiik56iijtg'
INT '40'
TOKEN 'jhdksa'
EOF '<EOF>'
我有一个字符串要使用 antlr4 解析,如果特定输入在字符串中匹配,我需要跳过一个标记。
例如,一个字符串包含如下数字和字符串:
String = "87uuujdhhfj12ooiik56iijtg40jhdksa";
解析输出:
87 uuujdhhfj
12 ooiik56iijtg //here 56 is skipped
40 jhdksa
如果字符串在解析时匹配 12,那么我需要在解析时跳过接下来的 12 个(12 以外的任何值都可以)字符。
对此类解析的任何参考或代码都会有所帮助。
在词法分析器中处理这个需要 predicate:
lexer grammar TLexer;
@members {
int charsToConsume = 0;
}
TOKEN
: ( {charsToConsume-- > 0}? [a-zA-Z0-9] )+
| [a-zA-Z]+
;
INT
: [0-9]+ {
int n = Integer.parseInt(getText());
if (n == 12) {
this.charsToConsume = 12;
}
}
;
您 运行 与 class:
import org.antlr.v4.runtime.*;
public class Main {
public static void main(String[] args) {
String source = "87uuujdhhfj12ooiik56iijtg40jhdksa";
TLexer lexer = new TLexer(CharStreams.fromString(source));
CommonTokenStream tokens = new CommonTokenStream(lexer);
tokens.fill();
for (Token t : tokens.getTokens()) {
System.out.printf("%-15s '%s'\n", TLexer.VOCABULARY.getSymbolicName(t.getType()), t.getText());
}
}
}
并将打印:
INT '87'
TOKEN 'uuujdhhfj'
INT '12'
TOKEN 'ooiik56iijtg'
INT '40'
TOKEN 'jhdksa'
EOF '<EOF>'