2010-10-31 57 views
1

我正在尝试为Lua创建ANTLR分析器。所以我把Nicolai Mainero制作的语法(可在ANTLR的网站上找到,Lua 5.1语法)并开始工作。ANTLR Lua长字符串语法规则

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

的Lua规范规则:文字

串也可以使用由长括号包围的 长格式定义。 我们定义一个开放长支架 级别n作为开放方括号 后跟n个等号,然后是 另一个开放方括号。所以,一个 0级的开放长括号是 写成[[,一级开放长括号 等级1写为[= [等 上。一个结束长支架的定义类似于 ;例如,关闭 等级4的长括号写为 ] ====]。长字符串以任何级别的 开头长支架开始,并且 以同级的第一次结束长支架 结束。括号内的这个 文字可以运行几行 行,不解释任何转义 序列,忽略任何其他级别的长括号 。他们可以包含 任何东西,除了结束括号 适当的水平,适当的水平。

我的问题接近this,但工具是不同的。

LONGSTRING的一些小例子:

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

有人可以帮我:

local a = [==[ Some interesting string [=[ sub string in string ]=] [hello indexes] [[And some line strings]] ]==] - its correct string. 
local f = [==[ Not interesting string ]=] - incorrect string 

这里我用了 '=' 符号LONGSTRING规则?谢谢!

+1

不要忘记漫长的评论。它们就像长字符串一样,但是以' - [['开始并以']]结尾。当然他们也允许有0个或更多的'='符号,以便它们可以明确地嵌套。 – RBerteig 2010-11-02 09:21:48

+0

@Rerteig,好点。在我的回答中,我没有具体提及它们,但是它们在我发布的语法片段中正确处理。 – 2010-11-02 10:26:09

+0

@Bart,只要你的评论规则处理'“ - ”'后面跟着没有空白的“LONGSTRING”。 – RBerteig 2010-11-02 19:09:47

回答

1

我曾经写过一个Lua语法根据规格和解决它像这样:

grammar Lua; 

// ... options ... 

// ... tokens ... 

@lexer::members { 
    public boolean noCloseAhead(int numEqSigns) { 
     if(input.LA(1) != ']') return true; 
     for(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+"]"); 
    } 
} 

// ... parser rules ... 

String 
    : '"' (~('"' | '\\') | EscapeSequence)* '"' 
    | '\'' (~('\'' | '\\') | EscapeSequence)* '\'' 
    | LongBracket 
    ; 

Comment 
    : (BlockComment | LineComment) {skip();} 
    ; 

fragment 
BlockComment 
    : '--' LongBracket 
    ; 

fragment 
LineComment 
    : '--' ~('\r' | '\n')* ('\r'? '\n' | EOF) 
    ; 

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

// ... more lexer rules ... 

小心你找到关于ANTLR维基什么!顾名思义:这是一个Wiki,可以发布相当简单的东西。你提到的Lua语法是一个不错的开始,但它有很多错误(二进制或十六进制文字也是不正确的,至少在我看它的时候......)。