У меня есть эта грамматика EBNF для языка сценариев Jass.
Что нужно сделать, чтобы преобразовать его в ANTLR 3.5?
Кроме того, существуют ли какие-либо инструменты, которые помогут мне в этом?
EBNF грамматика ANTLR3?
//----------------------------------------------------------------------
// Global Declarations
//----------------------------------------------------------------------
program ::= file+
file ::= newline? (declr newline)* func*
declr ::= typedef
| globals
| native_func
typedef ::= 'type' id 'extends' ('handle' | id)
globals ::= 'globals' newline global_var_list 'endglobals'
global_var_list
::= ('constant' type id '=' expr newline | var_declr newline)*
native_func
::= 'constant'? 'native' func_declr
func_declr
::= id 'takes' ('nothing' | param_list) 'returns' (type | 'nothing')
param_list
::= type id (',' type id)*
func ::= 'constant'? 'function' func_declr newline local_var_list statement_list 'endfunction' newline
//----------------------------------------------------------------------
// Local Declarations
//----------------------------------------------------------------------
local_var_list
::= ('local' var_declr newline)*
var_declr
::= type id ('=' expr)?
| type 'array' id
statement_list
::= (statement newline)*
statement
::= set
| call
| ifthenelse
| loop
| exitwhen
| return
| debug
set ::= 'set' id '=' expr
| 'set' id '[' expr ']' '=' expr
call ::= 'call' id '(' args? ')'
args ::= expr (',' expr)*
ifthenelse
::= 'if' expr 'then' newline statement_list else_clause? 'endif'
else_clause
::= 'else' newline statement_list
| 'elseif' expr 'then' newline statement_list else_clause?
loop ::= 'loop' newline statement_list 'endloop'
exitwhen ::= 'exitwhen' expr
return ::= 'return' expr?
debug ::= 'debug' (set | call | ifthenelse | loop)
//----------------------------------------------------------------------
// Expressions
//----------------------------------------------------------------------
expr ::= binary_op
| unary_op
| func_call
| array_ref
| func_ref
| id
| const
| parens
binary_op
::= expr ([+-*/><] | '==' | '!=' | '>=' | '<=' | 'and' | 'or') expr
unary_op ::= ('+' | '-' | 'not') expr
func_call
::= id '(' args? ')'
array_ref
::= id '[' expr ']'
func_ref ::= 'function' id
const ::= int_const
| real_const
| bool_const
| string_const
| 'null'
int_const
::= decimal
| octal
| hex
| fourcc
decimal ::= [1-9] [0-9]*
octal ::= '0' [0-7]*
hex ::= '$' [0-9a-fA-F]+
| '0' [xX] [0-9a-fA-F]+
fourcc ::= '' ' .{4} ' ''
real_const
::= [0-9]+ '.' [0-9]*
| '.' [0-9]+
bool_const
::= 'true'
| 'false'
string_const
::= '"' .* '"'
parens ::= '(' expr ')'
//----------------------------------------------------------------------
// Base RegEx
//----------------------------------------------------------------------
type ::= id
| 'code'
| 'handle'
| 'integer'
| 'real'
| 'boolean'
| 'string'
id ::= [a-zA-Z] ([a-zA-Z0-9_]* [a-zA-Z0-9])?
newline ::= '\n'+
Спасибо заранее к любому совету предлагается!
Как оказалось, грамматики ANTLR почти идентичны стандартным грамматикам EBNF. [Вот действительно хорошее справочное руководство по пониманию грамматик ANTLR3] (http://www.antlr.org/wiki/display/ANTLR3/Quick+Starter+on+Parser+Grammars+-+No+Past+Experience+Required) – RectangleEquals