Skip to main content

module examples::ql::Syntax

rascal-0.40.16
typepal-0.14.8

Usage

import examples::ql::Syntax;

Source code

http://github.com/usethesource/typepal/src/examples/ql/Syntax.rsc

syntax Form

start syntax Form
= form: "form" Id name "{" Question* questions "}"
;

syntax Question

syntax Question
= question: Label label Var var ":" Type type Value? value
| computed: Label label Var var ":" Type type "=" Expr expr Value? value
| ifThen: "if" "(" Expr cond ")" Question () !>> "else"
| ifThenElse: "if" "(" Expr cond ")" Question question "else" Question elseQuestion
| @Foldable group: "{" Question* questions "}"
| @Foldable @category="Comment" invisible: "(" Question* questions ")"
;

syntax Value

syntax Value
= "[" Const "]"
;

syntax Const

syntax Const
= @category="MetaAmbiguity" Expr!var!not!mul!div!add!sub!lt!leq!gt!geq!eq!neq!and!or
;

syntax Expr

syntax Expr
= var: Id name
| integer: Integer
| string: String
| money: Money
| boolean: Boolean
| bracket "(" Expr ")"
> not: "!" Expr
> left (
mul: Expr "*" Expr
| div: Expr "/" Expr
)
> left (
add: Expr "+" Expr
| sub: Expr "-" Expr
)
> non-assoc (
lt: Expr "\<" Expr
| leq: Expr "\<=" Expr
| gt: Expr "\>" Expr
| geq: Expr "\>=" Expr
| eq: Expr "==" Expr
| neq: Expr "!=" Expr
)
> left and: Expr "&&" Expr
> left or: Expr "||" Expr
;

syntax Keywords

keyword Keywords = "true" | "false" ;

syntax Var

lexical Var = Id;

syntax Label

lexical Label = @category="Constant" label: String;

syntax Type

syntax Type
= "boolean"
| "string"
| "integer"
| "money"
;

syntax String

lexical String = [\"] StrChar* [\"];

syntax StrChar

lexical StrChar
= ![\"\\]
| [\\][\\\"nfbtr]
;

syntax Boolean

lexical Boolean = "true" | "false";

syntax Integer

lexical Integer =  [\-]? [0-9]+ !>> [0-9];

syntax Money

lexical Money =  [\-]? [0-9]+ "." [0-9]* !>> [0-9] ;

syntax Standard

layout Standard = WhitespaceOrComment* !>> [\ \t\n\f\r] !>> "//" !>> "/*";

syntax Comment

syntax Comment 
= LineComment
| CStart CommentChar* CEnd
;

syntax LineComment

lexical LineComment
= @category="Comment" "//" ![\n\r]* $;

syntax CStart

syntax CStart = @category="Comment" "/*";

syntax CEnd

syntax CEnd = @category="Comment" "*/";

syntax CommentChar

syntax CommentChar 
= @category="Comment" ![*{}\ \t\n\f\r]
| @category="Comment" [*] !>> [/]
| Embed
;

syntax Embed

syntax Embed
= "{" Expr expr "}"
;

syntax WhitespaceOrComment

syntax WhitespaceOrComment 
= whitespace: Whitespace
| comment: Comment
;

syntax Whitespace

lexical Whitespace 
= [\u0009-\u000D \u0020 \u0085 \u00A0 \u1680 \u180E \u2000-\u200A \u2028 \u2029 \u202F \u205F \u3000]
;

syntax Id

lexical Id 
= ([a-z A-Z 0-9 _] !<< [a-z A-Z][\-a-z A-Z 0-9 _]* !>> [a-z A-Z 0-9 _]) \ Keywords
;