[antlr-interest] About removing the "; " In the last sentence of a block
roberto
rag700504 at hotmail.com
Wed Dec 7 14:37:19 PST 2011
Thank you very much, is exactly what I was trying to achieve.
I did a small change to what you sent me.
Inside the "program" and "block" rule I made the ';' optional.
==========================================
program : statement_list ';'? EOF ;
...
block : '*' '{' statement_list ';'? '}' ;
============================================
thank for your help...
Roberto
On 12/7/2011 4:38 PM, John B. Brodie wrote:
> Greetings!
>
> Replace your first 5 rules (e.g. program, statement_list, statement,
> compound_statement, and expression_statement) with these two rules:
>
> program : statement_list ';' EOF ;
>
> statement_list :
> ( expression (';' statement_list)? )
> | ( ';' statement_list )
> | ( ( sen_for | block ) statement_list? )
> ;
>
>
> (note please find attached the complete test grammar i used to test this...)
>
> and now that i think about it, it may not handle the last semicolon of
> the program properly when the last element of the program's
> statement_list is a block. sigh. maybe the statement_list for program
> should have the same semicolon usage as the statement_list within a
> block (e.g. the very last semicolon after the second 34 in your example
> should not be present)?
>
> anyway --- hope this helps...
>
> -jbb
>
>
> On 12/07/2011 04:27 PM, roberto wrote:
>> Hello Everyone
>>
>> I tried to create a simple language where I want to delete the last ';' which appears in a block. Besides having compound blocks, that do not need ';' at the end of the sentence.
>>
>> This example is what I have
>>
>> *{
>> a=34;;;;
>> for(34)
>> a=59;
>> }
>> a=34;
>>
>> I would like to remove the ';' which goes behind the 59. I wondered if there anyway of say when you find a TOKEN, do not consume this but continue
>>
>> expression_statement
>> : ';'
>> | expression (';' | *'}'*)
>> ;
>>
>> *For example I would like that when you find the'}'generates sentence but not because it will consume the token used by the command block.
>> *
>> =============== Here is the grammar I test ====================================
>>
>> grammar lteA;
>>
>> program
>> : statement_list EOF
>> ;
>>
>> statement_list
>> : statement+
>> ;
>>
>> statement
>> : compound_statement
>> | expression_statement
>> | block
>> ;
>>
>> compound_statement
>> : sen_for
>> ;
>>
>> expression_statement
>> : ';'
>> | expression (';' | '}')
>> ;
>>
>> expression
>> : ID '=' (INT | STRING | FLOAT | CHAR)
>> ;
>>
>> sen_for
>> : 'for' '(' INT ')'
>> ;
>> block
>> : '*' '{' statement_list '}'
>> ;
>>
>> ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
>> ;
>>
>> INT
>> : '0'..'9'+
>> | '0' 'x' HEX_DIGIT+
>> ;
>>
>> FLOAT
>> : ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
>> | '.' ('0'..'9')+ EXPONENT?
>> | ('0'..'9')+ EXPONENT
>> ;
>>
>> COMMENT
>> : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
>> | '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
>> ;
>>
>> WS : ( ' '
>> | '\t'
>> | '\r'
>> | '\n'
>> ) {$channel=HIDDEN;}
>> ;
>>
>> STRING
>> : '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
>> ;
>>
>>
>> CHAR: '\'' ( ESC_SEQ | ~('\''|'\\') ) '\''
>> ;
>>
>> fragment
>> EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
>>
>> fragment
>> HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
>>
>> fragment
>> ESC_SEQ
>> : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
>> | UNICODE_ESC
>> | OCTAL_ESC
>> ;
>>
>> fragment
>> OCTAL_ESC
>> : '\\' ('0'..'3') ('0'..'7') ('0'..'7')
>> | '\\' ('0'..'7') ('0'..'7')
>> | '\\' ('0'..'7')
>> ;
>>
>> fragment
>> UNICODE_ESC
>> : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
>> ;
>>
>> ===================================================================
>> best
>> regard Roberto
>>
>>
>> Note:
>> I rewrite because was scribble when convert the HTML to text
>>
>>
>>
More information about the antlr-interest
mailing list