程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ANTLR:词法分析 bash 文件,尤其是 heredoc大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决ANTLR:词法分析 bash 文件,尤其是 heredoc?

开发过程中遇到ANTLR:词法分析 bash 文件,尤其是 heredoc的问题如何解决?下面主要结合日常开发的经验,给出你关于ANTLR:词法分析 bash 文件,尤其是 heredoc的解决方法建议,希望对你解决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

解决方法

只能通过 preDicate 实现。

这是一个简单的例子

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,请注明来意。