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

Jim Idle jimi at temporal-wave.com
Thu Sep 27 21:03:19 PDT 2012


Starting with Oracle SQL as your first grammar is not a good idea. You
need to read the documentation and the getting started documents, as well
as the examples. You cannot direct the lexer from the parser for instance.
You need to step away and start with some small examples first. You cannot
solve the '[' html ']' issue in the manner you are trying I am afraid.

Jim

-----Original Message-----
From: antlr-interest-bounces at antlr.org
[mailto:antlr-interest-bounces at antlr.org] On Behalf Of wolfgang hämmer
Sent: Friday, September 28, 2012 4:17 AM
To: antlr-interest at antlr.org
Subject: [antlr-interest] Hide a lexer rules and call it explicitely from
parser rule

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_TES
T_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

List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe:
http://www.antlr.org/mailman/options/antlr-interest/your-email-address


More information about the antlr-interest mailing list