大佬教程收集整理的这篇文章主要介绍了ANTLR:词法分析 bash 文件,尤其是 heredoc,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 ANTLR 来 lex bash 文件(用于语法着色)。是否可以使用 heredoc:
等动态结束来词法规则cat <<ENDTEXT
Hello world,this text may contain
any letters,even ' and "
ENDTEXT
或
cat <<FOO
here a different end-word
is used
FOO
这是一个简单的例子:
lexer grAMMar BashLexer;
@members {
private Boolean heredocEndAhead(String partialHeredoC) {
if (this.getCharPositionInLine() != 0) {
// If the lexer is not at the start of a line,no end-delimiter can be possible
return false;
}
// Get the delimiter
String firstLine = partialHeredoc.split("\r?\n|\r")[0];
String delimiter = firstLine.replaceAll("^<<-?\\s*","");
for (int n = 1; n < delimiter.length(); n++) {
if (this._input.LA(n) != delimiter.charAt(n - 1)) {
return false;
}
}
// If we get to this point,we know there is an end delimiter ahead in the char stream,make
// sure it is followed by a white space (or the EOF). If we don't do this,then "FOOS" would also
// be considered the end for the delimiter "FOO"
int charAfterDelimiter = this._input.LA(delimiter.length() + 1);
return charAfterDelimiter == EOF || Character.isWhitespace(charAfterDelimiter);
}
}
HEREDOC
: '<<' '-'? [ \t]* [a-zA-Z_] [a-zA-Z_0-9]* NL ( {!heredocEndAhead(getText())}? . )* [a-zA-Z_] [a-zA-Z_0-9]*
;
ANY
: .
;
fragment NL
: '\r'? '\n'
| '\r'
;
将标记化输入:
@H_262_29@cat <<ENDTEXT
Hello world,ENDTEXTS ENDTEXT
this text may contain
any letters,even ' and "
ENDTEXT
像这样:
@H_262_29@ANY `c`
ANY `a`
ANY `t`
ANY ` `
HEREDOC `<<ENDTEXT\nHello world,\nENDTEXTS ENDTEXT\nthis text may contain \nany letters,even ' and "\nENDTEXT`
EOF `<EOF>`
以上是大佬教程为你收集整理的ANTLR:词法分析 bash 文件,尤其是 heredoc全部内容,希望文章能够帮你解决ANTLR:词法分析 bash 文件,尤其是 heredoc所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。