これを試して:
CHARACTERS
letter = 'A'..'Z' + 'a'..'z' .
digit = "0123456789" .
messageChar = '\u0020'..'\u007e' - ' ' - '(' - ')' .
TOKENS
double = ['-'] digit { digit } [ '.' digit { digit } ] .
ident = letter { letter | digit | '_' } .
message = messageChar { messageChar } CONTEXT (")") .
'\u0020'
ああ、それは Unicode SPACE であり、後で " " で削除することを指摘しなければなりません- ' '
。ああ、 CONTEXT (')')
複数の文字の先読みが必要ない場合に使用できます。上記のすべてのトークンが')'
.
FWIW:CONTEXT
囲まれたシーケンスを消費しません。プロダクションでそれを消費する必要があります。
編集:
わかりました、これはうまくいくようです。本当に、私は今回それを意味します:)
CHARACTERS
letter = 'A'..'Z' + 'a'..'z' .
digit = "0123456789" .
// messageChar = '\u0020'..'\u007e' - ' ' - '(' - ')' .
TOKENS
double = ['-'] digit { digit } [ '.' digit { digit } ] .
ident = letter { letter | digit | '_' } .
// message = letter { messageChar } CONTEXT (')') .
// MessageText<out string m> = message (. m = t.val; .)
// .
HearExpr<out HeardMessage message> =
(.
TimeSpan time;
Angle direction = Angle.NaN;
string messageText = "";
.)
"(hear"
TimeSpan<out time>
( "self" | AngleInDegrees<out direction> )
// MessageText<out messageText>
{
ANY (. messageText += t.val; .)
}
')'
(.
message = new HeardMessage(time, direction, new Message(messageText));
.)
.
ANY
')' または空白に到達するまで文字を読み取ります。各値を連結するループに入れましたが、そうしたくないかもしれません。ただし、「ここ」ではなく「ここ」を見たときに「上」を返さないように、ループに入れたい場合があります。messageText の単純な長さチェック、またはリストへの t.val の追加やカウントのチェックなどのその他の有効性チェックを実行できます。本当に何でも。RegEx を使用してテストを実行し、チェックする必要のあるパターンに準拠していることを確認することもできます。
編集 (2011 年 4 月 8 日):
Coco/R を整数と実数で使用する例
COMPILER Calculator
CHARACTERS
digit = "0123456789".
TOKENS
intNumber = ['-'] digit { digit } .
realNumber = ['-'] { digit } "." digit { digit }
[("e" | "E") ["+" | "-"] digit {digit}] .
PRODUCTIONS
Calculator = { Expression "=" } .
Expression = Term { "+" Term | "-" Term }.
Term = Factor { "*" Factor | "/" Factor }.
Factor = intNumber | realNumber .
END Calculator.
編集 (2011 年 4 月 9 日)
Factor<out double value>
(. value = 0.0; .)
=
(
intNumber
(. value = Convert.ToDouble(t.val); .)
|
realNumber
(. value = Convert.ToDouble(t.val); .)
)
| "(" Expression<out value> ")"
.
また
Factor<out double value>
(. value = 0.0; .)
=
( intNumber | realNumber )
(. value = Convert.ToDouble(t.val); .)
| "(" Expression<out value> ")"
.