pascalabcnet/Grammars/PascalABC.NET/PascalPreprocessor.grm
Бондарев Иван e6e67c193c initial commit
2015-05-14 21:35:07 +02:00

157 lines
3.9 KiB
Plaintext

"Name" = 'Pascal Preprocessor'
"Version" = '0.1'
"Author" = 'DarkStar'
"About" = 'PascalABC.NET project'
"Case Sensitive" = True
"Start Symbol" = <preprocessor_program>
!*
[TERMINALTEMPLATE]
{
%NAME% _%NAME%=new %NAME%(%PARAMS%);
_%NAME%.source_context=parsertools.GetTokenSourceContext();
%CODE%
return _%NAME%;
}
*!
!*
[NONTERMINALTEMPLATE0]
{
%NAME% _%NAME%=new %NAME%(%PARAMS%);
parsertools.create_source_context(_%NAME%,%LEFTTOKEN%,%RIGHTTOKEN%);
%CODE%
return _%NAME%;
}
*!
!add to list
!*
[NONTERMINALTEMPLATE1]
{
%NAME% _%NAME%=(%NAME%)%CODE%
return _%NAME%;
}
*!
!*
[NONTERMINALTEMPLATE2]
{
%NAME% _%NAME%;
%CODE%
return _%NAME%;
}
*!
!*
[NONTERMINALTEMPLATE3]
{
%NAME% _%NAME%=new %NAME%(%PARAMS%);
%CODE%
return _%NAME%;
}
*!
!for list:
!<el>
!<list> token <el>
!*
[NONTERMINALTEMPLATE6]
//TemplateList for %NAME% (create)
{
%NAME% _%NAME%=new %NAME%();
_%NAME%.source_context=((%CODE%)$1).source_context;
_%NAME%.%PARAMS%.Add((%CODE%)$1);
return _%NAME%;
}
*!
!*
[NONTERMINALTEMPLATE7]
//TemplateList for %NAME% (add)
{
%NAME% _%NAME%=(%NAME%)$1;
parsertools.create_source_context(_%NAME%,$$,$3);
_%NAME%.%PARAMS%.Add($3 as %CODE%);
return _%NAME%;
}
*!
Comment Start = '(*'
Comment End = '*)'
Comment Line = '//'
!{CR} = {#13}
!{LF} = {#10}
{Id Head} = {Letter} + [_] + ['.']
{Id Tail} = {Id Head} + {Digit} + ['.'] + [',']
{All ASCII} = {#1..#255}+{Cyrillic}+{#8100..#8800}
{New Line} = ['\']
{WS} = {Whitespace} - {CR} - {LF}
{WWSS} = {WS}
{Token Part1} = {All ASCII} - {CR} - {LF} - ['{']
{Token Part2} = {All ASCII} - {CR} - {LF} - ['$']
{Program line part1} = {All ASCII} - {CR} - {LF} - {WS} - ['{']
{Program line part2} = {All ASCII} - {CR} - {LF} - ['$']
Whitespace = {WS}+
{TextPart} = {All ASCII} - {Control Codes}
{String Ch} = {TextPart} - ['']
!TKPNDUNKNOW = '#' {Id Head}{Id Tail}* !*<token_info>*!
!TKPNDIF = '#if' !*<token_info>*!
!TKPNDIFDEF = '#ifdef' !*<token_info>*!
!TKPNDIFNDEF = '#ifndef' !*<token_info>*!
!TKPNDELIF = '#elif' !*<token_info>*!
!TKPNDELSE = '#else' !*<token_info>*!
!TKPNDENDIF = '#endif' !*<token_info>*!
TKNEWLINE = {CR}{LF}|{CR} !*<token_info>*!
TKPROGRAM_LINE_PART = ({Program line part1} | ('{' {Program line part2}))+ !*<token_info>*!
TKDIRECTIVE = '{$'{Id Head}{Id Tail}* ( (' ' {Id Head}{Id Tail}*) | '+' | '-')? '}' !*<token_info>*!
!TKPROGRAM_LINE = (( {Token Part1}+ | ('{' ( {Token Part2}| ({CR}{LF}|{CR}))) | ('' {String Ch}* '') )* ({CR}{LF}|{CR}) )* ({CR}{LF}|{CR})!*<token_info>*!
!TKPROGRAM_LINE_PART = ({Program line part1} | ('{' {Program line part2}+))+ !*<token_info>*!
!TKDIRECTIVE = '{$'{Id Head}{Id Tail}* ( (' ' {Id Head}{Id Tail}*) | '+' | '-')? '}' !*<token_info>*!
<preprocessor_program>
::= <directive_groups> <empty> !*3compilation_unit<>
$$.Language=LanguageId.PascalABCNET;
if($1!=null){
parsertools.create_source_context($$,$1,$1);
CompilerDirectives.AddRange(((compiler_directive_list)$1).directives);
}
*!
<directive_groups>
::= <_directive_groups>
|
<_directive_groups>
::= <directive_group> <empty> !*3compiler_directive_list<>
if($1 is compiler_directive)
$$.directives.Add((compiler_directive)$1);
parsertools.create_source_context($$,$1,$1);*!
| <directive_groups> <directive_group> !*1compiler_directive_list<>$1;
if($2 is compiler_directive)
$$.directives.Add((compiler_directive)$2);
parsertools.create_source_context($$,$1,$2);*!
<directive_group>
::= TKNEWLINE
| TKPROGRAM_LINE_PART
| TKDIRECTIVE <empty> !*1compiler_directive<>pascal_parsertools.MakeDirective((token_info)$1);*!
<empty>
::=