private static XpidlComment CreateXpidlComment(CommentSyntaxNode commentSyntaxNode) { if (commentSyntaxNode == null) { throw new ArgumentNullException("commentSyntaxNode"); } var xpidlComment = new XpidlComment(commentSyntaxNode.CommentText); return xpidlComment; }
public virtual void VisitComment(CommentSyntaxNode node) { node.Accept(this); }
private static XpidlInlineCHeader CreateXpidlInlineCHeader(CommentSyntaxNode inlineCHeaderSyntaxNode) { if (inlineCHeaderSyntaxNode == null) { throw new ArgumentNullException("inlineCHeaderSyntaxNode"); } var xpidlInlineCHeader = new XpidlInlineCHeader(inlineCHeaderSyntaxNode.CommentText); return xpidlInlineCHeader; }
private ComplexSyntaxNode ParseImpl(TextReader xpidlTextReader) { var goldParser = new GoldParser.Parser(xpidlTextReader, m_Grammar) { TrimReductions = true, IgnoreNestedComments = true }; goldParser.AddCommentSymbols( new Regex(@"^\/\*$", RegexOptions.Singleline), // /* new Regex(@"^\*\/$", RegexOptions.Singleline)); // */ goldParser.AddCommentSymbols( new Regex(@"^\%\{\s*C\+\+$", RegexOptions.Singleline), // %{ C++ new Regex(@"^\%\}(\s*C\+\+)?$", RegexOptions.Singleline)); // %} C++ var rootSyntaxNode = new ComplexSyntaxNode(null); while (true) { ParseMessage parseMessage = goldParser.Parse(); switch (parseMessage) { case ParseMessage.Empty: break; // Comment or inline C header case ParseMessage.CommentLineRead: case ParseMessage.CommentBlockRead: var commentSyntaxNode = new CommentSyntaxNode(goldParser.CommentText); if (goldParser.TokenSyntaxNode == null) { rootSyntaxNode.AddChildNode(commentSyntaxNode); } else { ((SyntaxNode)goldParser.TokenSyntaxNode).AttachCommentNode(commentSyntaxNode); } break; // Read valid token case ParseMessage.TokenRead: var simpleSyntaxNode = new SimpleSyntaxNode(goldParser.TokenSymbol, goldParser.TokenText); goldParser.TokenSyntaxNode = simpleSyntaxNode; break; // Can create new xpidl-node case ParseMessage.Reduction: var complexSyntaxNode = new ComplexSyntaxNode(goldParser.ReductionRule); for (Int32 i = 0; i < goldParser.ReductionCount; ++i) { var syntaxNode = (SyntaxNode)goldParser.GetReductionSyntaxNode(i); complexSyntaxNode.AddChildNode(syntaxNode); if (i == (goldParser.ReductionCount - 1)) { complexSyntaxNode.ReattachCommentNodes(syntaxNode); } else { syntaxNode.DetachCommentNodes(complexSyntaxNode); } } goldParser.TokenSyntaxNode = complexSyntaxNode; break; // Parsing successfully completed case ParseMessage.Accept: var acceptedSyntaxNode = (SyntaxNode)goldParser.TokenSyntaxNode; Debug.Assert(acceptedSyntaxNode != null); rootSyntaxNode.AddChildNode(acceptedSyntaxNode); acceptedSyntaxNode.DetachCommentNodes(rootSyntaxNode); return rootSyntaxNode; // Grammar table is not loaded case ParseMessage.NotLoadedError: throw new XpidlParserException("Grammar not loaded"); // Unexpected end of input case ParseMessage.CommentError: throw new XpidlParserException("Comment error"); // Invalid token case ParseMessage.LexicalError: throw new XpidlParserSyntaxException("Can not recognize token", goldParser.TokenText, goldParser.LineNumber, goldParser.LinePosition); // Unexpected token case ParseMessage.SyntaxError: throw new XpidlParserSyntaxException("Unexpected token", goldParser.TokenText, goldParser.LineNumber, goldParser.LinePosition); // Fatal internal error case ParseMessage.InternalError: throw new XpidlParserException("Internal parser error"); } } }