changes_summary.txt
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· 文本 代码 · 共 1,594 行 · 第 1/5 页
TXT
1,594 行
rule : (guard)? && <<p>>? expr
| next_alternative
;
The new style of context guarded predicate is equivalent to:
rule : <<guard==true && pred>>? expr
| next_alternative
;
It generates code which resembles:
if (lookahead(expr) && guard && pred) {
expr();
} else ...
Both forms of guarded predicates severely restrict the form of
the context guard: it can contain no rule references, no
(...)*, no (...)+, and no {...}. It may contain token and
token class references, and alternation ("|").
Addition for 1.33MR11: in the token expression all tokens must
be at the same height of the token tree:
(A ( B | C))? && ... is ok (all height 2)
(A ( B | ))? && ... is not ok (some 1, some 2)
(A B C D | E F G H)? && ... is ok (all height 4)
(A B C D | E )? && ... is not ok (some 4, some 1)
This restriction is required in order to properly compute the lookahead
set for expressions like:
rule1 : (A B C)? && <<pred>>? rule2 ;
rule2 : (A|X) (B|Y) (C|Z);
This addition was suggested by Rienier van den Born (reinier@vnet.ibm.com)
#109. (Changed in 1.33MR10) improved trace information
The quality of the trace information provided by the "-gd"
switch has been improved significantly. Here is an example
of the output from a test program. It shows the rule name,
the first token of lookahead, the call depth, and the guess
status:
exit rule gusxx {"?"} depth 2
enter rule gusxx {"?"} depth 2
enter rule gus1 {"o"} depth 3 guessing
guess done - returning to rule gus1 {"o"} at depth 3
(guess mode continues - an enclosing guess is still active)
guess done - returning to rule gus1 {"Z"} at depth 3
(guess mode continues - an enclosing guess is still active)
exit rule gus1 {"Z"} depth 3 guessing
guess done - returning to rule gusxx {"o"} at depth 2 (guess mode ends)
enter rule gus1 {"o"} depth 3
guess done - returning to rule gus1 {"o"} at depth 3 (guess mode ends)
guess done - returning to rule gus1 {"Z"} at depth 3 (guess mode ends)
exit rule gus1 {"Z"} depth 3
line 1: syntax error at "Z" missing SC
...
Rule trace reporting is controlled by the value of the integer
[zz]traceOptionValue: when it is positive tracing is enabled,
otherwise it is disabled. Tracing during guess mode is controlled
by the value of the integer [zz]traceGuessOptionValue. When
it is positive AND [zz]traceOptionValue is positive rule trace
is reported in guess mode.
The values of [zz]traceOptionValue and [zz]traceGuessOptionValue
can be adjusted by subroutine calls listed below.
Depending on the presence or absence of the antlr -gd switch
the variable [zz]traceOptionValueDefault is set to 0 or 1. When
the parser is initialized or [zz]traceReset() is called the
value of [zz]traceOptionValueDefault is copied to [zz]traceOptionValue.
The value of [zz]traceGuessOptionValue is always initialzed to 1,
but, as noted earlier, nothing will be reported unless
[zz]traceOptionValue is also positive.
When the parser state is saved/restored the value of the trace
variables are also saved/restored. If a restore causes a change in
reporting behavior from on to off or vice versa this will be reported.
When the -gd option is selected, the macro "#define zzTRACE_RULES"
is added to appropriate output files.
C++ mode
--------
int traceOption(int delta)
int traceGuessOption(int delta)
void traceReset()
int traceOptionValueDefault
C mode
--------
int zzTraceOption(int delta)
int zzTraceGuessOption(int delta)
void zzTraceReset()
int zzTraceOptionValueDefault
The argument "delta" is added to the traceOptionValue. To
turn on trace when inside a particular rule one:
rule : <<traceOption(+1);>>
(
rest-of-rule
)
<<traceOption(-1);>>
; /* fail clause */ <<traceOption(-1);>>
One can use the same idea to turn *off* tracing within a
rule by using a delta of (-1).
An improvement in the rule trace was suggested by Sramji
Ramanathan (ps@kumaran.com).
#108. A Note on Deallocation of Variables Allocated in Guess Mode
NOTE
------------------------------------------------------
This mechanism only works for heap allocated variables
------------------------------------------------------
The rewrite of the trace provides the machinery necessary
to properly free variables or undo actions following a
failed guess.
The macro zzUSER_GUESS_HOOK(guessSeq,zzrv) is expanded
as part of the zzGUESS macro. When a guess is opened
the value of zzrv is 0. When a longjmp() is executed to
undo the guess, the value of zzrv will be 1.
The macro zzUSER_GUESS_DONE_HOOK(guessSeq) is expanded
as part of the zzGUESS_DONE macro. This is executed
whether the guess succeeds or fails as part of closing
the guess.
The guessSeq is a sequence number which is assigned to each
guess and is incremented by 1 for each guess which becomes
active. It is needed by the user to associate the start of
a guess with the failure and/or completion (closing) of a
guess.
Guesses are nested. They must be closed in the reverse
of the order that they are opened.
In order to free memory used by a variable during a guess
a user must write a routine which can be called to
register the variable along with the current guess sequence
number provided by the zzUSER_GUESS_HOOK macro. If the guess
fails, all variables tagged with the corresponding guess
sequence number should be released. This is ugly, but
it would require a major rewrite of antlr 1.33 to use
some mechanism other than setjmp()/longjmp().
The order of calls for a *successful* guess would be:
zzUSER_GUESS_HOOK(guessSeq,0);
zzUSER_GUESS_DONE_HOOK(guessSeq);
The order of calls for a *failed* guess would be:
zzUSER_GUESS_HOOK(guessSeq,0);
zzUSER_GUESS_HOOK(guessSeq,1);
zzUSER_GUESS_DONE_HOOK(guessSeq);
The default definitions of these macros are empty strings.
Here is an example in C++ mode. The zzUSER_GUESS_HOOK and
zzUSER_GUESS_DONE_HOOK macros and myGuessHook() routine
can be used without change in both C and C++ versions.
----------------------------------------------------------------------
<<
#include "AToken.h"
typedef ANTLRCommonToken ANTLRToken;
#include "DLGLexer.h"
int main() {
{
DLGFileInput in(stdin);
DLGLexer lexer(&in,2000);
ANTLRTokenBuffer pipe(&lexer,1);
ANTLRCommonToken aToken;
P parser(&pipe);
lexer.setToken(&aToken);
parser.init();
parser.start();
};
fclose(stdin);
fclose(stdout);
return 0;
}
>>
<<
char *s=NULL;
#undef zzUSER_GUESS_HOOK
#define zzUSER_GUESS_HOOK(guessSeq,zzrv) myGuessHook(guessSeq,zzrv);
#undef zzUSER_GUESS_DONE_HOOK
#define zzUSER_GUESS_DONE_HOOK(guessSeq) myGuessHook(guessSeq,2);
void myGuessHook(int guessSeq,int zzrv) {
if (zzrv == 0) {
fprintf(stderr,"User hook: starting guess #%d\n",guessSeq);
} else if (zzrv == 1) {
free (s);
s=NULL;
fprintf(stderr,"User hook: failed guess #%d\n",guessSeq);
} else if (zzrv == 2) {
free (s);
s=NULL;
fprintf(stderr,"User hook: ending guess #%d\n",guessSeq);
};
}
>>
#token A "a"
#token "[\t \ \n]" <<skip();>>
class P {
start : (top)+
;
top : (which) ? <<fprintf(stderr,"%s is a which\n",s); free(s); s=NULL; >>
| other <<fprintf(stderr,"%s is an other\n",s); free(s); s=NULL; >>
; <<if (s != NULL) free(s); s=NULL; >>
which : which2
;
which2 : which3
;
which3
: (label)? <<fprintf(stderr,"%s is a label\n",s);>>
| (global)? <<fprintf(stderr,"%s is a global\n",s);>>
| (exclamation)? <<fprintf(stderr,"%s is an exclamation\n",s);>>
;
label : <<s=strdup(LT(1)->getText());>> A ":" ;
global : <<s=strdup(LT(1)->getText());>> A "::" ;
exclamation : <<s=strdup(LT(1)->getText());>> A "!" ;
other : <<s=strdup(LT(1)->getText());>> "other" ;
}
----------------------------------------------------------------------
This is a silly example, but illustrates the idea. For the input
"a ::" with tracing enabled the output begins:
----------------------------------------------------------------------
enter rule "start" depth 1
enter rule "top" depth 2
User hook: starting guess #1
enter rule "which" depth 3 guessing
enter rule "which2" depth 4 guessing
enter rule "which3" depth 5 guessing
User hook: starting guess #2
enter rule "label" depth 6 guessing
guess failed
User hook: failed guess #2
guess done - returning to rule "which3" at depth 5 (guess mode continues
- an enclosing guess is still active)
User hook: ending guess #2
User hook: starting guess #3
enter rule "global" depth 6 guessing
exit rule "global" depth 6 guessing
guess done - returning to rule "which3" at depth 5 (guess mode continues
- an enclosing guess is still active)
User hook: ending guess #3
enter rule "global" depth 6 guessing
exit rule "global" depth 6 guessing
exit rule "which3" depth 5 guessing
exit rule "which2" depth 4 guessing
exit rule "which" depth 3 guessing
guess done - returning to rule "top" at depth 2 (guess mode ends)
User hook: ending guess #1
enter rule "which" depth 3
.....
----------------------------------------------------------------------
Remember:
(a) Only init-actions are executed during guess mode.
(b) A rule can be invoked multiple times during guess mode.
(c) If the guess succeeds the rule will be called once more
without guess mode so that normal actions will be executed.
This means that the init-action might need to distinguish
between guess mode and non-guess mode using the variable
[zz]guessing.
#101. (Changed in 1.33MR10) antlr -info command line switch
-info
p - extra predicate information in generated file
t - information about tnode use:
at the end of each rule in generated file
summary on stderr at end of program
m - monitor progress
prints name of each rule as it is started
flushes
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?