Place holder in expression

Apr 8, 2010 at 5:40 AM
Edited Apr 8, 2010 at 5:41 AM

Hi,

I am new to Irony. But I have to give some quick result.

I have expression which can contaion:

1. Number: I am getting.

2. indetifier: I am getting.

3. Function: I am getting.

4. Place holder: If in expression X | Y | Z | A appear in any case. Then grammar should identify it as place holder not as identifier.

 

Regards,

Ashish Kundan

Coordinator
Apr 8, 2010 at 4:38 PM

Hi,

Don't quite understand what is place holder - just another terminal, some special thing?

You can declare it as non-terminal with a rule:

 

 

var placeHolder = new NonTerminal("PlaceHolder"); 

placeHolder.Rule = ToTerm("X") | "Y" | "Z" | "A";

 

Additionally you'll have to set priority of X,Y,Z,A to be higher than that of Identifier or function, like this:

ToTerm("X").Priority = 100;

ToTerm("Y").Priority = 100;

and so on...

Alternatively you can lower priority of Identifier and Function

 

 

Apr 9, 2010 at 3:42 AM

Hi,

Thanks a lot for youe reply.

Your understanding is correct. Solution that you provided is working. I was missing priority in my code.

Placeholder is just like an indicator. X mean someting, Y means something and  so on.

I defined node for place holder like:

public class PlaceHolderNode : AstNode {
      public string Name;
      public AstNode Argument;
      public override void Init(Irony.Parsing.ParsingContext context, Irony.Parsing.ParseTreeNode treeNode)
      {
          base.Init(context, treeNode);
          Name = treeNode.ChildNodes[0].FindTokenAndGetText();
          AsString = Name;
      }  
  }//class

It is accepting all. But I want this node to consider only x,y,z,a in upper and lower case.

Is there any help document available for Irony apart from source code.

Regards,

Ashish Kundan

Coordinator
Apr 9, 2010 at 6:16 PM

Just add lower-case strings to expression for placeHolder.Rule

Roman

Apr 10, 2010 at 2:44 AM

Thanks Roman.

I need to identify date in an expression. Can we use regular expression to define its rule?

 

Regards,

Ashish kundan

Coordinator
Apr 11, 2010 at 3:18 PM

It depends on what format the date is - are there any delimiters? You can use QuotedValueLiteral for VB-like dates : #01/02/2010#. Or FixedLengthLiteral if there are no quoting characters. Other possibility is CustomTerminal - you have to provide matching method implementation. Finally there's RegExBasedLiteral where you specify reg expr

Apr 12, 2010 at 6:57 AM

I got it. Thanks a lot.

Apr 14, 2010 at 7:48 AM

Roman,

 

I want to understand what are the important things that we need to take care while defining nodes. e.g I want to define a node for Nonterminal which contain only stock codes like IBM,MSFT etc. Those node I want to identify in expression as stock code node.

Regards,

Ashish Kundan

Coordinator
Apr 14, 2010 at 1:44 PM

Well, the only important thing for defining an AST node class is to make it implement IAstNodeInit interface - that would allow nodes to be automatically created and initialized by parser. IBrowsableAstNode lets node be displayed in AST tree view in Grammar Explorer. That's it - the rest is defined by semantics of your language or DSL, whatever you need them to do.

Apr 15, 2010 at 3:47 AM

Thanks again for the response and making such a wonderfull tool.

Apr 16, 2010 at 5:41 AM

Roman,

 

I wote parser to parse function call. It is like :

var number = TerminalFactory.CreateCSharpNumber("number");
var expression = new NonTerminal("expression");
var identifier = TerminalFactory.CreateCSharpIdentifier("identifier");
var fncall = new NonTerminal("fncall",typeof(FunctionCallNode));
var funArgument = new NonTerminal("funArgument");
var ArgList = new NonTerminal("ArgList", NodeType.GetNodeType("ExpressionListNode"));
fncall.Rule = functioName + OpenParen + ArgList + CloseParen;
ArgList.Rule = MakeStarRule(ArgList, comma, funArgument);
funArgument.Rule = expression| fncall | number;

 

expression id fun call or binary expression.

Above grammar parser function having argument expression, fncall and number in any order.

But I want only those funtion to be parsed whose first argumnet is expression or fncall and second argumnet is number.

Regards,

Ashish

Coordinator
Apr 16, 2010 at 6:37 PM
Edited Apr 17, 2010 at 4:05 PM

Hi

Grammar looks ok. What do you mean "only those functions to be parsed whose..." - you want to accept as valid only certain functions and reject others as errors?

If so, then I would recommend the following. Leave the grammar as is, and parser should accept all function calls. Note I mean Parser. The  in the after-parse validation you can check the function arguments and issue an error if it does not fit your restrictions. I think there's an event there which fires when parser creates AST node - you can handle this event and validate function args. Alternatively you can do it after parsing the file - by running thru the AST tree and validating all FunctionCallNodes. Finally, you can subclass FunctionCallNode and validate in Init method.

Roman 

Apr 17, 2010 at 3:46 PM

Yes Roman, your understanding is correct. Thanks for your quick reply.