look-ahead |
Top Previous Next |
Scripts > Class elements and c++ instructions > Calling a production > Look-ahead
Productions can be invoked in the interpreter to test whether the input text matches the production at the current position. If you use the look-ahead in combination with the IF symbol or by WHILE, you can parse texts, which aren't LL(1) conform or which are difficult to describe with a LL(1) grammar. By this look-ahead the current position isn't changed and the semantic code of the production isn't executed. Parameters therefore aren't necessary. The TextTransformer just recognizes a look-ahead call by the missing parameter, opposed to the call of a sub parser, which needs at least a string parameter. The text is tested either until a token is expected which doesn't exist in the text or until the last symbol of the production is recognized. So a bool value will be returned which is true if the text matches the production and false, if it doesn't match. Under no (logical) circumstances exceptions are thrown. A look-ahead can depend on other look-ahead productions which are tested inside of the first. The different levels of the look-ahead are represented as a number both in a separate field of the tool bar and as a preceding number in the stack window.
The part of text, which was recognized by the look-ahead can be accessed by the la_str() method of the parser state class. For example, you can pass this string to a sub parser.
A detailed example is the Java parser.
The result of the look-ahead depends on whether the look-ahead production is part of the system where it is called or not.
The production Ident is used as a look-ahead production in the same parser system, where it is used as a normal production. The input "int" yields the expected result: "int found", if the option for testing all literals is activated.
IF(!Ident()) "int" {{cout << "int found"; }} ELSE Ident {{cout << "error"; }} END
Ident ::= IDENT IDENT ::= \w+
If, however, an external production is used for the look-ahead:
isIdent ::= IDENT
IF(!isIdent()) "int" {{cout << "int found"; }} ELSE IDENT {{cout << "error"; }} END
the input "int" yields the error: "IDENT" expected. Since isIdent is a start production which isn't used in the main parser, it doesn't know the tokens of the main parser either. So "int" is nterpreted as IDENT and !isIdent() is wrong. The ELSE alternative is chosen. However, "int" was recognized in the main system as int what isn't accepted by IDENT then.
In other cases it is to use an external production for looking ahead is of advantage. So in the next example: SKIP will find the character at the end of a sentence even if the sentence starts with "What" or "How".
isQuestion ::= SKIP ( "?" | ( "." | "!" ) EXIT )
Sentence ::= IF(isQuestion()) Question ELSE NonQuestion END
Question ::= ( "What" {{ out << "You should better know than I!"; }} | "How" {{ out << "I don't know how!"; }} ) | {{ out << "I don't understand your question!"; }} IDENT+ "?"
NonQuestion ::= IDENT+ ( "." | "!" ) {{ out << "That's interesting!"; }}
|
This page belongs to the TextTransformer Documentation |
Home Content German |