Hello,
I am trying out Antlr for the very first time. My task is to define a string
template language, similar to
StringTemplate but with some formatting requirements. So I thought Antlr
would be suitable for this
task. I have managed to define the first part, well almost. I'd like to get
some feedback on my approach
as I feel I might be heading down the wrong path. Given a format string
"[yyyy]-[M]-[d] [H]:[m]"
the desired result is "2010-9-23 15:28". Right now I am getting
"20109231528".
How do I "capture" the dash and colon? Here's my grammar:
grammar TemplateCommand;
options {
language=CSharp2;
}
tokens {
TIMEFILTER = 'TimeFilter';
YEAR = 'yyyy';
MONTH = 'M';
DAY = 'd';
HOUR = 'H';
MINUTE = 'm';
}
@header {
using System.Text;
using System.Collections.Generic;
}
@members {
// Build template command using a StringBuilder
private StringBuilder builder = new StringBuilder();
// Used to resolve variables
private readonly IDictionary<string, string> resolver;
public TemplateCommandParser(ITokenStream input, IDictionary<string, string>
resolver)
: this(input)
{
this.resolver = resolver;
}
public string Result
{ get { return builder.ToString(); } }
}
// parser rules:
prog returns [string result]
: expression=templateExpression
{ result = $expression.text; }
;
templateExpression
: var=(WS | Text | Number | variable)+
{ builder.Append($var.text); }
;
variable
: '[' var=(TIMEFILTER | YEAR | MONTH | DAY | HOUR | MINUTE) ']'
{ builder.Append(resolver[$var.text]); }
;
// lexer rules:
Text : ('a'..'z' | 'A'..'Z' | ':' | ';' | '-')+ ;
Number : '1'..'9' ('0'..'9')* ;
WS : ' '+ ;
I pass a dictionary to the parser during construction. This dictionary
contains the variable
substitutions. Why isn't the templateExpression action able to capture the
dash and colon?
Is there an approach better suited to my task than using actions in this
way?
Thanks in advance!
(I have read up on StringTemplate and it doesn't quite fit with our
requirements.)
Daniel
List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe:
http://www.antlr.org/mailman/options/antlr-interest/your-email-address
--
You received this message because you are subscribed to the Google Groups
"il-antlr-interest" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/il-antlr-interest?hl=en.