【问题标题】:ANTLR4 parser detectionANTLR4 解析器检测
【发布时间】:2016-03-18 07:34:35
【问题描述】:

这是我第一次尝试使用 ANTLR4 语法。它应该识别一个非常简单的语句,以命令“label”开头,后跟一个冒号,然后是任意文本,以分号结尾。但是解析器不将“标签”识别为描述。为什么?

grammar test;



 prog: stat+;

  stat:  
    description content
  ;

  description: 
     'label' COLON   
  ;

  content: 
    TEXT 
  ;

  TEXT: 
     .*? ';'
  ;

  STRING : '"' ('""'|~'"')* '"' ; // quote-quote is an escaped quote

  COMMENT
    : '//' (~('\n'|'\r'))*
  ; 

  COLON      : ':' ;
  ID: [a-zA-z]+;
  INT: [0-9]+;
  NEWLINE: '\r'? '\n';
  WS  :   [ \t\n\r]+ -> skip ;

代码示例:

label: 
this is an error;


wronglabel:YYY
this should be a error;

错误是:

第 1:0 行不匹配输入“标签:\n这是一个错误;”期待“标签” (prog label:\n这是一个错误;\n\n\nwronglabel:YYY\n这应该是一个错误;\n)

【问题讨论】:

  • 旁白:这不是错了吗:ID: [a-zA-z]+;
  • 似乎是正确的。我将它与其他示例中的 ID 定义进行了比较,这似乎是定义仅由字母组成的 ID 的常用方法。
  • 如果我以这种方式修改 TEXT-token:TEXT: '"' .*? '"' ';' ;它工作得更好。我仍然不知道确切,为什么。
  • 对不起,我应该澄清一下。我的意思是,第二个 z 不应该是大写吗?
  • 现在我明白了:因为你是对的!

标签: parsing antlr4


【解决方案1】:

这样效果更好:

grammar test;

 prog: stat+;

  stat:  
    description content
  ;

  description: 
     'label' COLON   
  ;

  content: 
    text 
  ;

  text: 
     .*? ';'
  ;

  STRING : '"' ('""'|~'"')* '"' ; // quote-quote is an escaped quote

  COMMENT
    : '//' (~('\n'|'\r'))*
  ; 

  COLON      : ':' ;
  ID: [a-zA-z]+;
  NEWLINE: '\r'? '\n';
  WS  :   [ \t\n\r]+ -> skip ;

似乎我混合了词法分析器和解析器规则: 词法分析器规则必须小写, 解析器规则大写。 所以我把 TEXT-rule 改成了 text-rule。

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多