【问题标题】:Lexer rule for a sentence一个句子的 Lexer 规则
【发布时间】:2015-02-09 11:47:33
【问题描述】:

我知道词法分析器规则是匹配单词而不是句子。但是有没有可能做到。因为我的输入有以下格式

ADD FILE first-doc VERSION 1 TYPE sequential FIXED 23 BLOCK 23 MODE 
ebdic LABEL standard KEY REC_NR#09545 RULE DOMANI _ scorebestand MKC

和另一个输入可能有类似

ADD FILE secound-doc VERSION 3 TYPE normal FIXED 39 BLOCK 39 MODE 
gdieds LABEL constant KEY CTR-NR#62872 
RULE CBTPSN49 : dagextract (loadfile) met key PIB_KLN_NR 

在以上两个输入中,我的解析器规则如下所示

add_file   :
'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String 
'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String
'LABEL' String KEY  key=String ;

我能够写到 KEY,因为一切都是单个单词,但无法继续使用 RULE,因为它因句子而异

即使我尝试过贪婪匹配

All   : .*;

但这对我来说是个错误。

上述语句的词法分析器规则

WhiteSpace: ('\r' | '\t' | '\u000C' | '\n' | ' ') { $channel=HIDDEN; };

COMMENT:('**'.*'\n'|'REMARKS'.*'\n')*{skip();};

String: ('a'..'z'|'A'..'Z'|'-'|'#') ('a'..'z'|'A'..'Z'|'0'..'9'|'-'|'#')*;

Integer: '-'? ('0' | '1'..'9' ('0'..'9')*);

我的问题是“是否可以使用一个词法分析器规则匹配多个单词? 如果有,该怎么做?”

我只能在 ANTLR 4 中实现这一点吗?我对这个 ANTLR 只有两周大 请帮忙。

提前致谢

【问题讨论】:

    标签: antlr lexer


    【解决方案1】:

    下面的 ANTLR4 parser 规则会读取所有内容,直到行尾。

    add_file   :
    'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String 
    'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String
    'LABEL' String 'KEY'  key=String 'RULE' expr=everything_until_CR '\r'? '\n'?;
    
    everything_until_CR : ~('\n'|'\r')* ;
    

    ANTLR3 中,不幸的是,这似乎不起作用。下面建议了一个解决方法 lexer 规则。您必须去掉目标语言中的前导“规则”。

    RULE : 'RULE ' ~('\n'|'\r')* ;
    
    add_file   :
      'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String 
      'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String
      'LABEL' String 'KEY'  key=String
      expr=RULE '\r'? '\n'? {System.out.println($expr.text.substring(5));}
    ;
    

    如果您确实需要上下文相关的 lexer 规则,请查看 island grammars(链接到 ANTLR3 文档)。 '希望这会有所帮助!

    【讨论】:

    • 嗨@Marc Q。everything_until_CR : ~('\n')+ ; 在我的情况下不起作用
    • 嗨,马赫斯!我对 ANTLR3 的假设是否正确?你不使用 ANTLR4 的原因是什么?
    • 是的,我只使用 ANTLR 3。我没有用于安装 Antlr 4 Eclipse 插件的 Eclipse 4。尽管我尝试使用 build.xml 生成词法分析器和解析器。但是从 ANTLR 3 到 ANTLR 4 的语法不同,并且 ANTLR 4 不采用重写规则。由于我的时间很少,我继续使用 ANTLR 3
    • @Mahes 为 ANTLR3 添加了“解决方案”。
    • 嗨@Marc Q。我的文件有这样的重写规则^( XML_ELEMENT["SOURCE"] ^(XML_ATTRIBUTE["BUSINESSNAME"]) ^(XML_ATTRIBUTE["DATABASETYPE"] CONSTANT["FLAT FILE"]) ^(XML_ATTRIBUTE["DBDNAME"] CONSTANT["FLAT_FILE"]) ^(XML_ATTRIBUTE["DESCRIPTION"]) ^(XML_ATTRIBUTE["NAME"] $file) ^(XML_ATTRIBUTE["OBJECTVERSION"] CONSTANT["1"]) ^(XML_ATTRIBUTE["OWNERNAME"]) ^(XML_ATTRIBUTE["VERSIONNUMBER"] $ver]) 我认为重写规则的存在是有问题的。因为在解释器中它正在为您的解决方案生成树。但它没有按预期生成所需的 XML。
    【解决方案2】:

    我想出了另一种解析句子的方法,只需在末尾添加String*。请看下面我的语法,它看起来很好用

    add_file : 'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String 'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String 'LABEL' String 'KEY' key=String 'RULE' String*;

    //字符串的词法分析规则

    String: ('a'..'z'|'A'..'Z'|'-'|'#'|':') ('a'..'z'|'A'..'Z'|'0'..'9'|'-'|'#'|':')*;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多