【问题标题】:ANTLR Lua long string grammar rulesANTLR Lua 长字符串语法规则
【发布时间】:2010-10-31 21:51:14
【问题描述】:

我正在尝试为 Lua 创建 ANTLR 解析器。所以我采用了 Nicolai Mainero 制作的语法(可在 ANTLR 的网站上获得,Lua 5.1 语法)并开始工作。

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

Lua 规范规则:字面量

字符串也可以使用 长括号括起来的长格式。 我们定义了一个长括号 第 n 级作为左方括号 后跟 n 个等号,后跟 另一个左方括号。所以,一个 0 级的开长括号是 写成 [[,一个左长括号 1 级的写成 [=[,所以 在。定义了一个闭合长括号 相似地;例如,关闭 4级的长括号写为 ]====]。长字符串以 打开任何级别的长括号和 结束于第一个闭合长括号 同级别的。这里面的字数 括号形式可以运行多个 行,不要解释任何转义 序列,并忽略长括号 任何其他级别。它们可以包含 除了右括号之外的任何东西 适当的水平。适当的水平。

我的问题与this 的含义很接近,但工具不同。

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 的规则:

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

有人可以帮助我吗?谢谢!

【问题讨论】:

  • 不要忘记长 cmets。它们就像长字符串,但以--[[ 开头并以]] 结尾。当然,它们也允许使用 0 个或多个 = 符号,以便它们可以明确嵌套。
  • @RBerteig,说得好。我没有在回答中具体提及它们,但它们在我发布的语法的 sn-p 中得到了妥善处理。
  • @Bart,是的,只要您的评论规则处理 "--" 后跟 LONGSTRING 而没有空格。

标签: parsing lua antlr lexer antlr3


【解决方案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 上找到的内容!顾名思义:这是一个 Wiki,可以很容易地发布内容。您提到的 Lua 语法是一个不错的开始,但其中有很多错误(二进制或十六进制文字也是不正确的,至少在我查看它的时候......)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    相关资源
    最近更新 更多