[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