public virtual literal create_string_const(GPBParser parser)
		{
			literal lt;
            string text = parser.LRParser.TokenString;
			if (text.Length==3 && text[0]=='\'' && text[2]=='\'')
			{
				lt=new char_const(text[1]);
                lt.source_context = GetTokenSourceContext(parser.LRParser);//create_source_context(token);
				return lt;
			}
            text = ReplaceSpecialSymbols(text.Substring(1, text.Length - 2));
			lt=new string_const(text);
            lt.source_context = GetTokenSourceContext(parser.LRParser);//create_source_context(token);
			return lt;
			
		}
        public GoldParser.Parser parser; // Ужас - два разных парсера! SSM 19.01.12

        public virtual void check_comment_text(GPBParser parser)
        {

        }
        public virtual const_node create_int_const(GPBParser parser, System.Globalization.NumberStyles NumberStyles)
		{
            //таблица целых констант на уровне синтаксиса
            //      не может быть - 0 +
            // 32--------16----8----|----8----16--------32----------------64(bits)
            // [  int64  )[       int32       ](  int64 ](      uint64     ]
            string text = parser.LRParser.TokenString;
            if (NumberStyles == System.Globalization.NumberStyles.HexNumber)
                text = text.Substring(1);
            const_node cn=new int32_const();
            SourceContext sc = GetTokenSourceContext(parser.LRParser);//create_source_context(token);
            if (text.Length < 8)
                (cn as int32_const).val = Int32.Parse(text, NumberStyles);
            else
            {
                try
                {
                    UInt64 uint64 = UInt64.Parse(text, NumberStyles);
                    if (uint64 <= Int32.MaxValue)
                        (cn as int32_const).val = (Int32)uint64;
                    else
                        if (uint64 <= Int64.MaxValue)
                            cn = new int64_const((Int64)uint64);
                        else
                            cn = new uint64_const(uint64);
                }
                catch (Exception)
                {
                    if(NumberStyles == System.Globalization.NumberStyles.HexNumber)
                        parser.errors.Add(new BadHex(parser.current_file_name, sc, (syntax_tree_node)parser.prev_node));
                    else
                        parser.errors.Add(new BadInt(parser.current_file_name, sc, (syntax_tree_node)parser.prev_node));
                }
            }
            cn.source_context = sc;
			return cn;
		}
 public virtual ident create_ident(GPBParser parser)
 {
     string text = parser.LRParser.TokenString;
     if (text.IndexOf('&') == 0)
         text = text.Substring(1);
     ident id = new ident(text);
     id.source_context = GetTokenSourceContext(parser.LRParser);
     return id;
 }
 public virtual const_node create_hex_const(GPBParser parser)
 {
     return create_int_const(parser, System.Globalization.NumberStyles.HexNumber);
 }
        public virtual const_node create_double_const(GPBParser parser)
		{
			const_node cn=null;
            SourceContext sc = GetTokenSourceContext(parser.LRParser);
			try
			{
				System.Globalization.NumberFormatInfo sgnfi=new System.Globalization.NumberFormatInfo();
				sgnfi.NumberDecimalSeparator=".";
				double val=double.Parse(parser.LRParser.TokenString,sgnfi);
				cn=new double_const(val);
				cn.source_context=sc;
			}
			catch(Exception)
			{
				parser.errors.Add(new BadFloat(parser.current_file_name,sc,(syntax_tree_node)parser.prev_node));
			}
			return cn;
		}
 public virtual sharp_char_const create_sharp_char_const(GPBParser parser)
 {
     string text = parser.LRParser.TokenString;
     string int_text = new string(text.ToCharArray(1, text.Length - 1));
     SourceContext sc = GetTokenSourceContext(parser.LRParser);//create_source_context(token);
     sharp_char_const scc = null;
     int val = 0;
     if (int.TryParse(int_text, out val))
     {
         if (val > max_char_const)
         {
             scc = new sharp_char_const(0);
             parser.errors.Add(new TooBigCharNumberInSharpCharConstant(parser.current_file_name, sc, scc));
         }
         else
             scc = new sharp_char_const(val);
         scc.source_context = sc;
     }
     else
     {
         parser.errors.Add(new TooBigCharNumberInSharpCharConstant(parser.current_file_name, sc, scc));
     }
     return scc;
 }
 public virtual char_const create_char_const(GPBParser parser)
 {
     return create_char_const(parser.LRParser.TokenString,GetTokenSourceContext(parser.LRParser));
 }
 public virtual ident create_directive_name(GPBParser parser)
 {
     return create_directive_name(parser.LRParser.TokenString, GetTokenSourceContext(parser.LRParser));
 }