[antlr-interest] Hide a lexer rules and call it explicitely from parser rule

wolfgang hämmer wolfgang at haemmer.net
Thu Sep 27 13:17:07 PDT 2012


Hi,

I need to call a lexer rule explicitely but I can't declare it as fragment
as I want to reference it in a parser rule.

I want to call the rule explicitely, because the same pattern represented
by the rule occurs in several places in the code. I don't want the lexer
rule to match in these places.

The lexer rule is PUT_EXPRESSION.
Below my grammar, a code example and the error.

And at my wits end ;-) . Thank you for your help.

wolf

My grammar:

/*******************************************************************************

DESCRIPTION:
        Oracle PL/SQL Grammar for ANTLR v3, target language JAVA
AUTHOR:
        Wolfgang Hämmer (wolfgang.haemmer at bsg.ch)
DATE:
        25-Apr-2012
BASED ON:
        This grammar is for AVALOQ FILE REPORT.
COMMENT:

KNOWN ISSUES:

HISTORY:

*******************************************************************************/

grammar SRC_REP_FILE;

options {
    language=Java;
    backtrack=true;
    memoize=true;
    output=AST;
}

import PARSER_BASE;

@lexer::members {
    public static final int CHANNEL_COMMENT = HIDDEN + 1;
    public static final int CHANNEL_PUT = HIDDEN + 2;
}

start_rule
    :    report_body EOF
    ;

report_body
    :
        LBRACK REPORT NUMBER RBRACK validity? r=REPORT n=report_name
        {
            if (gPARSER_BASE.f_scope_trace >= gPARSER_BASE.f_trace_low) {
System.out.println("package_body-new scope: " + $n.text); };
            gPARSER_BASE.f_currentScopePkg.define($n.text);
            gPARSER_BASE.f_currentScopePkg = gPARSER_BASE.new
Scope(gPARSER_BASE.f_currentScopePkg);
        }
        report_naming datamart layout END REPORT
        {
            if (gPARSER_BASE.f_scope_trace >= gPARSER_BASE.f_trace_low)
System.out.println("package_body-pop scope");
            gPARSER_BASE.f_currentScopePkg =
gPARSER_BASE.f_currentScopePkg.pop();
        }
    ->    ^(REPORT_BODY[$r] report_name validity? report_naming datamart
layout)
    ;

validity
    :    OBSOLETE DOUBLEQUOTED_STRING
    |    SUBSTITUTE DOUBLEQUOTED_STRING
    ;

datamart
    :
    DATAMART on_dtm? CONNECT identifier AS identifier
    dtm_where_clause? dtm_group_by? dtm_consolidate? END DATAMART |
    DATAMART identifier
    ;

dtm_where_clause
    :
    (WHERE LBRACK plsql_condition RBRACK) => WHERE LBRACK plsql_condition
RBRACK
    ;

dtm_group_by
    :
    GROUP BY dtm_group_by_expr+
    ;

dtm_group_by_expr
    :
    identifier LBRACK plsql_expression RBRACK dtm_order_by?
    ;

dtm_order_by
    :
    ORDER BY LBRACK ( plsql_expression (ASC | DESC)? COMMA? )+ RBRACK (ASC
| DESC)?
    ;

dtm_consolidate
    :
    CONSOLIDATE on_dtm+
    ;

on_dtm
    :
    ON (REPORT | TOP | identifier) (INHERIT identifier)? field*
    ;

field
    :
    call_name type_spec (SUM | VERBOSE_ASSIGN) LBRACK plsql_expression
RBRACK
    ;

layout
    :
    report_type import_declaration+ filename on_layout END LAYOUT |
    report_type filename import_declaration* on_layout END LAYOUT
    ;

report_type
    :
    XLS LAYOUT | FILE LAYOUT type_declaration
    ;

type_declaration
    :
    TYPE identifier
    ;

filename
    :
    FILENAME plsql_expression
    ;

on_layout
    :
    ON i=(REPORT | TOP | identifier)
    {if (gPARSER_BASE.f_trace >= gPARSER_BASE.f_trace_low)
System.out.println("ON_LAYOUT: " + $i.text);}
    (HEAD | FOOT) seq_of_statements on_layout?
    ;

statement
    :    assignment_statement
    |    exit_statement
    |    case_statement
    |    if_statement
    |    raise_statement
    |    return_statement
    |    plsql_block
    |    function_expression
    |    for_statement
    |    while_statement
    |    with_statement
    |    put_statement
    |    NULL
    ;

put_statement
    :
    PUT_STATEMENT
    ;

A                : 'A';
ALIGN            : 'ALIGN';
AND                : 'AND';
ANY                : 'ANY';
AS                : 'AS';
ASC                : 'ASC';
BEGIN            : 'BEGIN';
BETWEEN            : 'BETWEEN';
BOOLEAN            : 'BOOLEAN';
BY                : 'BY';
CASE            : 'CASE';
COLUMN            : 'COLUMN';
CONNECT            : 'CONNECT';
CONSOLIDATE        : 'CONSOLIDATE';
CONSTANT        : 'CONSTANT';
CTX                : 'CTX';
DATAMART        : 'DATAMART';
DATE            : 'DATE';
DECLARE            : 'DECLARE';
DEFAULT            : 'DEFAULT';
DESC            : 'DESC';
DFLTLANG        : 'DFLTLANG';
DO                : 'DO';
ELSE            : 'ELSE';
ELSIF            : 'ELSIF';
EMPTY            : 'EMPTY';
END                : 'END';
ENGLISH            : 'ENGLISH';
EQUALS_PATH        : 'EQUALS_PATH';
ESCAPE            : 'ESCAPE';
EXCEPTION        : 'EXCEPTION';
EXTENDABLE         : 'EXTENDABLE';
EXTENSION        : 'EXTENSION';
EXIT            : 'EXIT';
FALSE            : 'FALSE';
FILE            : 'FILE';
FILENAME        : 'FILENAME';
FINAL            : 'FINAL';
FOR                : 'FOR';
FOOT            : 'FOOT';
FRENCH            : 'FRENCH';
FUNCTION        : 'FUNCTION';
GERMAN            : 'GERMAN';
GROUP            : 'GROUP';
HEAD            : 'HEAD';
ID_QUALIFIER    : 'ID';
IF                : 'IF';
IMPORT            : 'IMPORT';
IN                : 'IN';
INHERIT            : 'INHERIT';
INSERT            : 'INSERT';
IS                : 'IS';
ITALIAN            : 'ITALIAN';
LABEL            : 'LABEL';
LAYOUT            : 'LAYOUT';
LEFT            : 'LEFT';
LIKE            : 'LIKE';
LIKE2            : 'LIKE2';
LIKE4            : 'LIKE4';
LIKEC            : 'LIKEC';
LONG            : 'LONG';
LOOP            : 'LOOP';
MEMBER            : 'MEMBER';
MOD                  : 'MOD';
NAMING             : 'NAMING';
NATIVE             : 'NATIVE';
NEW                : 'NEW';
NOT                : 'NOT';
NULL            : 'NULL';
OBSOLETE        : 'OBSOLETE';
OF                : 'OF';
ON                : 'ON';
ONLY            : 'ONLY';
OR                : 'OR';
ORDER            : 'ORDER';
PACKAGE         : 'PACKAGE';
PILLAR            : 'PILLAR';
PILLAR_DONE        : 'PILLAR_DONE';
PRESENT         : 'PRESENT';
PROCEDURE        : 'PROCEDURE';
PRINT            : 'PRINT';
PRIVATE            : 'PRIVATE';
PROTECTED        : 'PROTECTED';
PUBLIC            : 'PUBLIC';
PUT_STATEMENT    : 'PUT' SQUARED_BRACKED_EXPRESSION;
RAISE            : 'RAISE';
REGEXP_LIKE        : 'REGEXP_LIKE';
REPORT            : 'REPORT';
RETURN            : 'RETURN';
REVERSE            : 'REVERSE';
RIGHT            : 'RIGHT';
SCRIPT            : 'SCRIPT';
SET                : 'SET';
SPANISH            : 'SPANISH';
SUBMULTISET        : 'SUBMULTISET';
SUBSTITUTE        : 'SUBSTITUTE';
SUM                : 'SUM';
TAB                : 'TAB';
TEXT            : 'TEXT';
THEN            : 'THEN';
TIME_TZ            : 'TIME_TZ';
TOP                : 'TOP';
TRUE            : 'TRUE';
TYPE            : 'TYPE';
UNDER_PATH        : 'UNDER_PATH';
UPDATE            : 'UPDATE';
UPSERT            : 'UPSERT';
USER_ID            : 'USER_ID';
USING            : 'USING';
VERBOSE_ASSIGN    : 'ASSIGN';
WHEN            : 'WHEN';
WHERE            : 'WHERE';
WHILE            : 'WHILE';
WITH            : 'WITH';
XLS                : 'XLS';

QUOTED_STRING
    :    ( 'n' )? '\'' ( '\'\'' | ~('\'') )* '\''
    ;

DOUBLEQUOTED_STRING
    :    '"' ~('"')* '"'
    ;

ID /*options { testLiterals=true; }*/
    :    'A' .. 'Z' ( 'A' .. 'Z' | '0' .. '9' | '_' | '$' | '#' )*
    ;

SEMI
    :    ';'
    ;

COLON
    :    ':'
    ;

DOUBLEDOT
    :    POINT POINT
    ;

DOT
    :    POINT
    ;

fragment
POINT
    :    '.'
    ;

COMMA
    :    ','
    ;

EXPONENT
    :    '**'
    ;

ASTERISK
    :    '*'
    ;

AT_SIGN
    :    '@'
    ;

RPAREN
    :    ')'
    ;

LPAREN
    :    '('
    ;

RBRACK
    :    ']'
    ;


LBRACK
    :    '['
    ;

PLUS
    :    '+'
    ;

MINUS
    :    '-'
    ;

DIVIDE
    :    '/'
    ;

EQ
    :    '='
    ;

PERCENTAGE
    :    '%'
    ;

LLABEL
    :    '<<'
    ;

RLABEL
    :    '>>'
    ;

ASSIGN
    :    ':='
    ;

ARROW
    :    '=>'
    ;

VERTBAR
    :    '|'
    ;

DOUBLEVERTBAR
    :    '||'
    ;

NOT_EQ
    :    '<>' | '!=' | '^='
    ;

LTH
    :    '<'
    ;

LEQ
    :    '<='
    ;

GTH
    :    '>'
    ;

GEQ
    :    '>='
    ;

NUMBER
    :
    (( N POINT N ) => N POINT N
    |            POINT N
    |            N
    )
    ( 'E' ( PLUS | MINUS )? N )?
    ;

fragment
N
    : '0' .. '9' ( '0' .. '9' )*
    ;

QUOTE
    :    '\''
    ;

NEWLINE
    :    ('\r'? '\n') {$channel=HIDDEN;};

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

SL_COMMENT
    :    '--' ~('\n'|'\r')* '\r'? '\n' {$channel=CHANNEL_COMMENT;}
    ;

ML_COMMENT
    :    '/*' ( options {greedy=false;} : . )* '*/'
{$channel=CHANNEL_COMMENT;}
    ;

fragment
SQUARED_BRACKED_EXPRESSION
    :
    '[' (options {greedy=false;} :  .)* ']'
    ;


Some code:

[REPORT 2.0]

REPORT ATS_TEST_REP.TEST_CASE


----------------------------------------------------------------------------
  NAMING
    DFLTLANG  "TEST CASE HTML OVERVIEW"
  USER_ID     "TC"



----------------------------------------------------------------------------
  -- DATAMART

----------------------------------------------------------------------------
  DATAMART

    CONNECT DTM_ATS_TEST_REP AS DTM
      WHERE [DTM.ATS_TEST_PRC_TYPE.INTL_ID != 'DESCN']


    GROUP BY
      ENV_MODULE    [DTM.ENV_MODULE_ID]
           ORDER BY [DTM.ENV_MODULE.USER_ID]

      ENV_COMPO     [DTM.ENV_COMPO_ID]
           ORDER BY [DTM.ENV_COMPO.USER_ID]

      TEST_CASE     [DTM.ATS_TEST_CASE_STEP_ID]
           ORDER BY [DTM.ATS_TEST_CASE_NAME]

      TEST_STEP     [DTM.ATS_TEST_STEP_ID]


    CONSOLIDATE

      ON TOP
        PAR_COMPO_ID NUMBER   ASSIGN
[TASK_EXEC.PARAM('ENV_COMPO_ID').NR_VAL]

      ON ENV_MODULE
        NAME        TEXT      ASSIGN    [DTM.ENV_MODULE.NAME]
        USER_ID     TEXT      ASSIGN    [DTM.ENV_MODULE.USER_ID]
        STEP_CNT    NUMBER    SUM       [ENV_COMPO.STEP_CNT]
        TC_CNT      NUMBER    SUM       [ENV_COMPO.TC_CNT]
        COMPO_CNT   NUMBER    SUM       [ENV_COMPO.COMPO_CNT]

      ON ENV_COMPO
        NAME        TEXT      ASSIGN    [DTM.ENV_COMPO.NAME]
        USER_ID     TEXT      ASSIGN    [DTM.ENV_COMPO.USER_ID]
        STEP_CNT    NUMBER    SUM       [TEST_CASE.STEP_CNT]
        TC_CNT      NUMBER    SUM       [TEST_CASE.TC_CNT]
        COMPO_CNT   NUMBER    ASSIGN    [1]

      ON TEST_CASE
        NAME        TEXT      ASSIGN    [DTM.ATS_TEST_CASE_NAME]
        INTL_ID     TEXT      ASSIGN    [DTM.ATS_TEST_CASE_STEP.INTL_ID]
        STEP_CNT    NUMBER    SUM       [TEST_STEP.STEP_CNT]
        TC_CNT      NUMBER    ASSIGN    [1]

      ON TEST_STEP
        STEP_CNT    NUMBER    ASSIGN    [1]

  END DATAMART



----------------------------------------------------------------------------
  -- LAYOUT

----------------------------------------------------------------------------
  FILE LAYOUT
    TYPE HTML
    IMPORT ATS_TEST_REP;
    FILENAME ATS_TEST_REP.FILE_NAME(ATS_TEST_REP.C_REP_TYPE_TEST_CASE,
FALSE, TOP.PAR_COMPO_ID)


--------------------------------------------------------------------------
    ON REPORT HEAD
      PUT
        [
<HTML>
  <HEAD>
    <TITLE>[ATS_TEST_REP.PAGE_TITLE(ATS_TEST_REP.C_REP_TYPE_TEST_CASE,
FALSE, TOP.PAR_COMPO_ID)]</TITLE>
    [ATS_TEST_REP.CSS]
  </HEAD>
  <BODY>
    <H1>[ATS_TEST_REP.PAGE_TITLE(ATS_TEST_REP.C_REP_TYPE_TEST_CASE, FALSE,
TOP.PAR_COMPO_ID)]</H1>
    <TABLE>
      <TR>
        <TH CLASS="MODULE">MODULE</TH>
        <TH CLASS="COMPO">COMPO</TH>
        <TH CLASS="TC">TEST CASE</TH>
        <TH CLASS="CNT">TEST CASE/STEP #</TH>
      </TR>
        ]



--------------------------------------------------------------------------
    ON ENV_MODULE HEAD
      PUT
        [
      <TR>
        <TD CLASS="MODULE"
ROWSPAN="[ENV_MODULE.TC_CNT+ENV_MODULE.COMPO_CNT+1]">[ENV_MODULE.USER_ID]</TD>
        <TD CLASS="MODULE" COLSPAN="2">&NBSP;</TD>
        <TD CLASS="MODULE CNT">[ENV_MODULE.TC_CNT]</TD>
      </TR>
        ]



--------------------------------------------------------------------------
    ON ENV_COMPO HEAD
      PUT
        [
      <TR>
        <TD CLASS="COMPO"
ROWSPAN="[ENV_COMPO.TC_CNT+1]">[ENV_COMPO.USER_ID]</TD>
        <TD CLASS="COMPO">&NBSP;</TD>
        <TD CLASS="COMPO CNT">[ENV_COMPO.TC_CNT]</TD>
      </TR>
        ]



--------------------------------------------------------------------------
    ON TEST_CASE HEAD
      PUT
        [
      <TR>
        <TD CLASS="TC"><A
HREF="[ATS_TEST_REP.FILE_NAME(ATS_TEST_REP.C_REP_TYPE_TEST_CASE, TRUE,
TOP.PAR_COMPO_ID)]#[ATS_TEST_REP.LINK_REF(ATS_TEST_REP.C_LINK_REF_TYPE_TEST_CASE,
TEST_CASE.INTL_ID)]">[TEST_CASE.NAME]</A></TD>
        <TD CLASS="TC CNT">[TEST_CASE.STEP_CNT]</TD>
      </TR>
        ]



--------------------------------------------------------------------------
    ON REPORT FOOT
      PUT
        [
    </TABLE>
  </BODY>
</HTML>
        ]

  END LAYOUT

END REPORT

error:

line 74:6 mismatched input 'PUT' expecting PUT_STATEMENT
line 88:39 no viable alternative at character '#'
line 95:6 mismatched input 'PUT' expecting PUT_STATEMENT
line 99:39 no viable alternative at character '&'
line 107:6 mismatched input 'PUT' expecting PUT_STATEMENT
line 111:26 no viable alternative at character '&'
line 119:6 mismatched input 'PUT' expecting PUT_STATEMENT
line 130:6 mismatched input 'PUT' expecting PUT_STATEMENT


More information about the antlr-interest mailing list