zoukankan      html  css  js  c++  java
  • antlr v4 使用指南连载4——词法规则入门之黄金定律

    词法规则入门#

    黄金定律一二

    1. 若输入串能被多个词法规则匹配,那么声明在词法文件最前面的规则生效。

    parser

    parser grammar HelloParser;
    options {
    	language=Java;
    	tokenVocab=HelloLexer;
    }
    
    start : HI ID;
    

    lexer例1

    lexer grammar HelloLexer; 	//Definea grammar called Hello
    ID : [a-zA-Z]+;
    HI : 'H' 'I';
    WS : [	
     ]+->skip;	//skip spaces,tabs,newlines,
    (Windows)
    

    lexer例2

    lexer grammar HelloLexer; 	//Definea grammar called Hello
    HI : 'H' 'I';
    ID : [a-zA-Z]+;
    WS : [	
     ]+->skip;	//skip spaces,tabs,newlines,
    (Windows)
    

    当输入串为HI antlr时,对于语法规则start,只有使用例2的词法文件时,才能匹配成功。原因在于,这两个例子中,HI可以被词法规则HI、ID匹配。对于例1,输入串HI,被词法ID优先匹配,antlr也被ID词法匹配,所以无法匹配语法规则start : HI ID;。对于例2,输入串HI,被词法HI优先匹配,antlr被ID词法匹配。

    1. 输入串将被最长匹配的词法规则匹配。下面用一个稍微复杂一点的例子来说明,本来可以不用例子,一句话也能说明白。比如ABCD肯定会被能完全匹配ABCD的词法规则匹配,而不是将ABCD拆开分别被匹配,例如被两个词法ABC、D匹配。

    parser

    parser grammar HelloParser;
    options {
    	language=Java;
    	tokenVocab=HelloLexer;
    }
    numeric_literal : INTEGER | NUMERIC;
    

    lexer

    //lexer
    lexer grammar HelloLexer; 	//Definea grammar called Hello
    ZERO : '0';
    DOT : '.';
    UNDERLINE : '_';
    HI : 'H' 'I';
    
    fragment
        DIGIT : [0-9];
    
    INTEGER : ZERO|[1-9] DIGIT*;
    NUMERIC : INTEGER DOT DIGIT+;
    ALPHABET : [a-zA-Z];
    ID : (ALPHABET|UNDERLINE) (DIGIT|ALPHABET|UNDERLINE)+;
    WS : [	
     ]+->skip;	//skip spaces,tabs,newlines,
    (Windows)
    

    对于输入串12.03,只会被NUMERIC词法匹配,而不会被拆成12.03分别被INTEGER、DOT、INTEGER、INTEGER匹配。这就是最长匹配原则,也叫贪婪匹配。

    未完待续>>>

  • 相关阅读:
    JVM调优之Tomcat启动参数配置及详解
    项目启动部署时报错:java.lang.NoSuchMethodError
    Springboot系列:@SpringBootApplication注解
    Tomcat下部署SpringBoot
    springboot 使用传统方式部署
    Spring Boot 学习笔记一(SpringBoot启动过程)
    Spring Boot【快速入门】
    Windows系统CPU内存网络性能统计第一篇 内存
    MinGW-w64非官方编译器集成安装包(很清楚)
    SyncML是一平台无关的信息同步标准协议集
  • 原文地址:https://www.cnblogs.com/laud/p/antlr4_4.html
Copyright © 2011-2022 走看看