【问题标题】:Ignore some part of input when parsing with ANTLR使用 ANTLR 解析时忽略输入的某些部分
【发布时间】:2014-07-04 09:46:55
【问题描述】:

我正在尝试通过 ANTLR (ANTLRWorks-3.5.2) 解析一种语言。目标是输入完整的输入,但 Antlr 给出了语法中已定义部分的解析树并忽略其余输入,例如这是我的语法:

grammar asap;
project : '/begin PROJECT' name  module+ '/end PROJECT';    
module : '/begin MODULE'name '/end MODULE'; 
name :   IDENT ;              
IDENT :     ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'.'|':'|'-')*;

给定输入:

/begin PROJECT HybridSailboat_2 
/begin MODULE engine

/begin A2ML
/include XCP_common_v1_0.aml
"XCP" struct {      
taggedstruct Common_Parameters ;
};
/end A2ML

/end MODULE
/end PROJECT

关于这个输入,我只希望解析树包含项目和模块,而不是 A2ML 部分。 在 antlr 中是否有可能忽略输入的某些部分? 我可以指定语法中不重要部分的起点和终点吗?

【问题讨论】:

    标签: antlr antlr3 information-extraction


    【解决方案1】:

    只需将A2ML 部分作为词法分析器中的单个标记和skip() 它匹配:

    grammar asap;
    
    project
     : BEGIN_PROJECT name module* END_PROJECT EOF
     ;
    
    module
     : BEGIN_MODULE name END_MODULE
     ;
    
    name
     :   IDENT
     ;  
    
    IDENT
     : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'.'|':'|'-')*
     ;
    
    BEGIN_PROJECT
     : '/begin' S 'PROJECT'
     ;
    
    END_PROJECT
     : '/end' S 'PROJECT'
     ;
    
    BEGIN_MODULE
     : '/begin' S 'MODULE'
     ;
    
    END_MODULE
     : '/end' S 'MODULE'
     ;
    
    A2ML
     : '/begin' S 'A2ML' .* '/end' S 'A2ML' {skip();}
     ;
    
    SPACES
     : S {skip();}
     ;
    
    fragment S
     : (' ' | '\t' | '\r' | '\n')+
     ;
    

    【讨论】:

      猜你喜欢
      • 2014-07-09
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多