[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