ANTLR Lua长字符串语法规则

我正在尝试创建Lua的ANTLR解析器。因此,我采用了由Nicolai Mainero(可在ANTLR网站上获取,Lua 5.1语法)生成的语法并开始工作。

语法不错。有一件事情不起作用:长字符串。

Lua规范规则:文字

字符串还可以使用由长括号括起来的长格式定义。 我们将等级为n的开口长括号定义为开口方括号 其后是n个等号,其后是另一个开口方括号。所以,一个 级别0的开口长括号写为[[,一个开口长括号 级别1写为[=,依此类推。关闭长括号也类似地定义;例如,关闭 级别4的长括号写为] ==== ]。长字符串以开口长括号开头的任何级别开始 并在同一级别的第一个关闭长括号处结束。在这种文字中 括号形式可以运行多行,不解释任何转义 序列,并忽略任何其他级别的长括号。他们可以包含 任何东西,除了适当级别的关闭括号。

我的问题与相近,但工具不同。

LONGSTRING的一些小示例没有'='符号:

local a = [==[ Some interesting string [=[ sub string in string ]=] [hello indexes] [[And some line strings]] ]==] - 正确的字符串。
local f = [==[ Not interesting string ]=] - 不正确的字符串

这是我的规则,没有'='符号的LONGSTRING:

LONGSTRING:'[['(〜(']')|']'(〜(']'))* ']]';

有人能帮我吗?谢谢。

原文链接 https://stackoverflow.com/questions/4065327

点赞
stackoverflow用户50476
stackoverflow用户50476

我曾按照规范编写了一个Lua语法,并像这样解决了它:

语法Lua;

// ...选项...

// ...记号...

@lexer :: members {
    public boolean noCloseAhead(int numEqSigns){
        ifinput.LA(1)!= '] ')返回truefor(int i = 2; i < numEqSigns + 2; i++) {
            if(input.LA(i) != '=') return true;
        }
        return input.LA(numEqSigns+2) != ']';
    }

    public void matchClose(int numEqSigns) throws MismatchedTokenException {
        StringBuilder eqSigns = new StringBuilder();
        for(int i = 0; i < numEqSigns; i++) {
            eqSigns.append('=');
        }
        match("]"+eqSigns+"]");
    }
}

// ...解析器规则...

字符串
  :  '"'  (~('“'  | '\\') | EscapeSequence)* '“'
  |  ' ' '(~('   ' | '\\') | EscapeSequence)* ' ' ' 
  |  LongBracket
  ;

评论
  :  (BlockComment | LineComment){skip();} 
  ; 

片段 
BlockComment
  :  '-' - LongBracket 
  ; 

片段 
LineComment
  :  '-' - ('\r' | '\n') *('\r'' \n'|EOF)
  ;

片段 
LongBracket
@init{int openEq = 0;} 
  :  '[''=' {openEq ++;}) *' ['({noCloseAhead(openEq)}?= >。)* {matchClose(openEq);}
  ;

// ...更多的词汇规则...

要谨慎对待在ANTLR Wiki上找到的内容!正如其名称所示:它是一个维基百科,可以轻松地发布内容。您提到的Lua语法是一个很好的开始,但其中有相当多的错误(二进制或十六进制文字也是不正确的,至少在我查看它的时候...)。

2010-10-31 22:11:11