BNF grammar files

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

BNF grammar files

psillysimon2003
Hi,
I am new to using grammatica, and its been years since I wrote something in BNF. I am trying to setup a command parser,
and I have it working when I group my command tokens such as
ADD_COMMAND = "add lb monitor" but when I break it up  so that I have tokens for "add" "lb" "monitor" It fails with my input. I know it must be something silly I am forgetting. Can someone eyeball my grammar below. The data file that fails is below. It complains there is no "add" | "bind" in column 1 but there is in the input file.

Below is the grammar. Thanks in advance

net.percederberg.grammatica.parser.ParserLogException: unexpected
token "add" <IDENTIFIER_STRING>, expected one of "add", or "bind", on line 1 column: 1


add lb monitor DEFAULT_HTTP "/" "."
add lb monitor wowza "/" "Wowza Media Server 2" -port 8086
add lb
monitor tcp_check
add server wowza3 63.240.112.28
add server
wowza2 63.240.112.27
add server wowza1 63.240.112.26




%tokens%
NUMBER                       = <<[0-9]+>>
SINGLE_LINE_COMMENT          = <<//.*>> %ignore%
MULTI_LINE_COMMENT           = <</\*([^*]|\*+[^*/])*\*+/>> %ignore%
IDENTIFIER_STRING            = <<[a-zA-Z][a-zA-Z0-9-_]*>>
QUOTED_STRING                = <<"[^"]*"|'[^']*'>>
WHITESPACE                   = <<[ \t\n\r]+>> %ignore%
COMMENT                      = <<--([^\n\r-]|-[^\n\r-])*(--|-?[\n\r])>> %ignore%
IP_ADDRESS                   = <<\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b>>
EMAIL_ADDRESS                 = <<\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b>>


PORT_OPTION                    = "-port"
ADD_TOKEN                    = "add"
SERVER_TOKEN                  = "server"
SERVICE_TOKEN                = "service"
LB_TOKEN                    = "lb"
MONITOR_TOKEN                = "monitor"
VSERVER_TOKEN                = "vserver"
BIND_TOKEN                    = "bind"
ALERT_TOKEN                 = "alert"

/** Production definitions **/
%productions%
Start = CmdDefinition +;
CmdDefinition          = AddServerCmd | AddLbMonitorCmd | AddServiceCmd | AddLbVserverCmd | BindLbMonCmd| BindLbVserverCmd | BindAlertServiceCmd;

AddServer            = ADD_TOKEN WHITESPACE? SERVER_TOKEN;
AddService            = ADD_TOKEN SERVICE_TOKEN;
AddLb                 = ADD_TOKEN LB_TOKEN;
AddServerCmd          = AddServer WHITESPACE? IDENTIFIER_STRING WHITESPACE? IP_ADDRESS;
AddLbMonitorCmd      = AddLb MONITOR_TOKEN  WHITESPACE? IDENTIFIER_STRING WHITESPACE? QUOTED_STRING WHITESPACE? QUOTED_STRING WHITESPACE? [PORT_OPTION NUMBER] | AddLb MONITOR_TOKEN WHITESPACE? IDENTIFIER_STRING;
AddServiceCmd        = AddService IDENTIFIER_STRING IDENTIFIER_STRING NUMBER;
AddLbVserverCmd      = AddLb VSERVER_TOKEN IDENTIFIER_STRING;

BindLb                = BIND_TOKEN LB_TOKEN;
BindAlert            = BIND_TOKEN ALERT_TOKEN;
BindLbMonCmd         = BindLb MONITOR_TOKEN IDENTIFIER_STRING IDENTIFIER_STRING;
BindLbVserverCmd     = BindLb VSERVER_TOKEN IDENTIFIER_STRING IDENTIFIER_STRING;
BindAlertServiceCmd = BindAlert SERVICE_TOKEN IDENTIFIER_STRING EMAIL_ADDRESS;


     

_______________________________________________
Grammatica-users mailing list
[hidden email]
http://lists.nongnu.org/mailman/listinfo/grammatica-users
Reply | Threaded
Open this post in threaded view
|

Re: BNF grammar files

Per Cederberg
If two token definitions match the same character sequence, such as
"add" being both IDENTIFIER_STRING and ADD_TOKEN, then the top
definition from the grammar file is chosen.

So. If you put your constant tokens at the top of the token list you
should be fine.

Cheers,

/Per Cederberg

On Sat, Jun 19, 2010 at 16:38, Dan Miller <[hidden email]> wrote:

> Hi,
> I am new to using grammatica, and its been years since I wrote something in BNF. I am trying to setup a command parser,
> and I have it working when I group my command tokens such as
> ADD_COMMAND = "add lb monitor" but when I break it up  so that I have tokens for "add" "lb" "monitor" It fails with my input. I know it must be something silly I am forgetting. Can someone eyeball my grammar below. The data file that fails is below. It complains there is no "add" | "bind" in column 1 but there is in the input file.
>
> Below is the grammar. Thanks in advance
>
> net.percederberg.grammatica.parser.ParserLogException: unexpected
> token "add" <IDENTIFIER_STRING>, expected one of "add", or "bind", on line 1 column: 1
>
>
> add lb monitor DEFAULT_HTTP "/" "."
> add lb monitor wowza "/" "Wowza Media Server 2" -port 8086
> add lb
> monitor tcp_check
> add server wowza3 63.240.112.28
> add server
> wowza2 63.240.112.27
> add server wowza1 63.240.112.26
>
>
>
>
> %tokens%
> NUMBER                       = <<[0-9]+>>
> SINGLE_LINE_COMMENT          = <<//.*>> %ignore%
> MULTI_LINE_COMMENT           = <</\*([^*]|\*+[^*/])*\*+/>> %ignore%
> IDENTIFIER_STRING            = <<[a-zA-Z][a-zA-Z0-9-_]*>>
> QUOTED_STRING                = <<"[^"]*"|'[^']*'>>
> WHITESPACE                   = <<[ \t\n\r]+>> %ignore%
> COMMENT                      = <<--([^\n\r-]|-[^\n\r-])*(--|-?[\n\r])>> %ignore%
> IP_ADDRESS                   = <<\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b>>
> EMAIL_ADDRESS                 = <<\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b>>
>
>
> PORT_OPTION                    = "-port"
> ADD_TOKEN                    = "add"
> SERVER_TOKEN                  = "server"
> SERVICE_TOKEN                = "service"
> LB_TOKEN                    = "lb"
> MONITOR_TOKEN                = "monitor"
> VSERVER_TOKEN                = "vserver"
> BIND_TOKEN                    = "bind"
> ALERT_TOKEN                 = "alert"
>
> /** Production definitions **/
> %productions%
> Start = CmdDefinition +;
> CmdDefinition          = AddServerCmd | AddLbMonitorCmd | AddServiceCmd | AddLbVserverCmd | BindLbMonCmd| BindLbVserverCmd | BindAlertServiceCmd;
>
> AddServer            = ADD_TOKEN WHITESPACE? SERVER_TOKEN;
> AddService            = ADD_TOKEN SERVICE_TOKEN;
> AddLb                 = ADD_TOKEN LB_TOKEN;
> AddServerCmd          = AddServer WHITESPACE? IDENTIFIER_STRING WHITESPACE? IP_ADDRESS;
> AddLbMonitorCmd      = AddLb MONITOR_TOKEN  WHITESPACE? IDENTIFIER_STRING WHITESPACE? QUOTED_STRING WHITESPACE? QUOTED_STRING WHITESPACE? [PORT_OPTION NUMBER] | AddLb MONITOR_TOKEN WHITESPACE? IDENTIFIER_STRING;
> AddServiceCmd        = AddService IDENTIFIER_STRING IDENTIFIER_STRING NUMBER;
> AddLbVserverCmd      = AddLb VSERVER_TOKEN IDENTIFIER_STRING;
>
> BindLb                = BIND_TOKEN LB_TOKEN;
> BindAlert            = BIND_TOKEN ALERT_TOKEN;
> BindLbMonCmd         = BindLb MONITOR_TOKEN IDENTIFIER_STRING IDENTIFIER_STRING;
> BindLbVserverCmd     = BindLb VSERVER_TOKEN IDENTIFIER_STRING IDENTIFIER_STRING;
> BindAlertServiceCmd = BindAlert SERVICE_TOKEN IDENTIFIER_STRING EMAIL_ADDRESS;
>
>
>
>
> _______________________________________________
> Grammatica-users mailing list
> [hidden email]
> http://lists.nongnu.org/mailman/listinfo/grammatica-users
>

_______________________________________________
Grammatica-users mailing list
[hidden email]
http://lists.nongnu.org/mailman/listinfo/grammatica-users
Reply | Threaded
Open this post in threaded view
|

Re: BNF grammar files

psillysimon2003
That solved the issue, thanks - I just found your project and I can see many uses for it. It is nice and simple and works well. Thanks





----- Original Message ----
From: Per Cederberg <[hidden email]>
To: [hidden email]
Sent: Sat, June 19, 2010 4:55:42 PM
Subject: Re: [Grammatica-users] BNF grammar files

If two token definitions match the same character sequence, such as
"add" being both IDENTIFIER_STRING and ADD_TOKEN, then the top
definition from the grammar file is chosen.

So. If you put your constant tokens at the top of the token list you
should be fine.

Cheers,

/Per Cederberg

On Sat, Jun 19, 2010 at 16:38, Dan Miller <[hidden email]> wrote:

> Hi,
> I am new to using grammatica, and its been years since I wrote something in BNF. I am trying to setup a command parser,
> and I have it working when I group my command tokens such as
> ADD_COMMAND = "add lb monitor" but when I break it up  so that I have tokens for "add" "lb" "monitor" It fails with my input. I know it must be something silly I am forgetting. Can someone eyeball my grammar below. The data file that fails is below. It complains there is no "add" | "bind" in column 1 but there is in the input file.
>
> Below is the grammar. Thanks in advance
>
> net.percederberg.grammatica.parser.ParserLogException: unexpected
> token "add" <IDENTIFIER_STRING>, expected one of "add", or "bind", on line 1 column: 1
>
>
> add lb monitor DEFAULT_HTTP "/" "."
> add lb monitor wowza "/" "Wowza Media Server 2" -port 8086
> add lb
> monitor tcp_check
> add server wowza3 63.240.112.28
> add server
> wowza2 63.240.112.27
> add server wowza1 63.240.112.26
>
>
>
>
> %tokens%
> NUMBER                       = <<[0-9]+>>
> SINGLE_LINE_COMMENT          = <<//.*>> %ignore%
> MULTI_LINE_COMMENT           = <</\*([^*]|\*+[^*/])*\*+/>> %ignore%
> IDENTIFIER_STRING            = <<[a-zA-Z][a-zA-Z0-9-_]*>>
> QUOTED_STRING                = <<"[^"]*"|'[^']*'>>
> WHITESPACE                   = <<[ \t\n\r]+>> %ignore%
> COMMENT                      = <<--([^\n\r-]|-[^\n\r-])*(--|-?[\n\r])>> %ignore%
> IP_ADDRESS                   = <<\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b>>
> EMAIL_ADDRESS                 = <<\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b>>
>
>
> PORT_OPTION                    = "-port"
> ADD_TOKEN                    = "add"
> SERVER_TOKEN                  = "server"
> SERVICE_TOKEN                = "service"
> LB_TOKEN                    = "lb"
> MONITOR_TOKEN                = "monitor"
> VSERVER_TOKEN                = "vserver"
> BIND_TOKEN                    = "bind"
> ALERT_TOKEN                 = "alert"
>
> /** Production definitions **/
> %productions%
> Start = CmdDefinition +;
> CmdDefinition          = AddServerCmd | AddLbMonitorCmd | AddServiceCmd | AddLbVserverCmd | BindLbMonCmd| BindLbVserverCmd | BindAlertServiceCmd;
>
> AddServer            = ADD_TOKEN WHITESPACE? SERVER_TOKEN;
> AddService            = ADD_TOKEN SERVICE_TOKEN;
> AddLb                 = ADD_TOKEN LB_TOKEN;
> AddServerCmd          = AddServer WHITESPACE? IDENTIFIER_STRING WHITESPACE? IP_ADDRESS;
> AddLbMonitorCmd      = AddLb MONITOR_TOKEN  WHITESPACE? IDENTIFIER_STRING WHITESPACE? QUOTED_STRING WHITESPACE? QUOTED_STRING WHITESPACE? [PORT_OPTION NUMBER] | AddLb MONITOR_TOKEN WHITESPACE? IDENTIFIER_STRING;
> AddServiceCmd        = AddService IDENTIFIER_STRING IDENTIFIER_STRING NUMBER;
> AddLbVserverCmd      = AddLb VSERVER_TOKEN IDENTIFIER_STRING;
>
> BindLb                = BIND_TOKEN LB_TOKEN;
> BindAlert            = BIND_TOKEN ALERT_TOKEN;
> BindLbMonCmd         = BindLb MONITOR_TOKEN IDENTIFIER_STRING IDENTIFIER_STRING;
> BindLbVserverCmd     = BindLb VSERVER_TOKEN IDENTIFIER_STRING IDENTIFIER_STRING;
> BindAlertServiceCmd = BindAlert SERVICE_TOKEN IDENTIFIER_STRING EMAIL_ADDRESS;
>
>
>
>
> _______________________________________________
> Grammatica-users mailing list
> [hidden email]
> http://lists.nongnu.org/mailman/listinfo/grammatica-users
>

_______________________________________________
Grammatica-users mailing list
[hidden email]
http://lists.nongnu.org/mailman/listinfo/grammatica-users



     

_______________________________________________
Grammatica-users mailing list
[hidden email]
http://lists.nongnu.org/mailman/listinfo/grammatica-users