成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

介紹C# Parsing Library

開發 后端
本文介紹了C# Parsing Library,即一個模仿Boost.Spirit的LL解析器庫,可以在C#中模擬ENBF文法定義。

C# Parsing Library 是一個LL解析器產生框架,可以在C#中模擬ENBF文法定義。設計思路來自于Boost.Spirit,一個C++解析器框架。

一)C# Parsing Library:Parser 基本概念

a) 文法定義舉例:P ::= a b    C#用法:P = a + b    序列

b) 文法定義舉例:P ::= a | b  C#用法:P = a | b    選擇

c) 文法定義舉例:P ::= a *    C#用法:P = a.Star   0..n次匹配

d) 文法定義舉例:P ::= a +    C#用法:P = a.Plus   1..n次匹配

e) 文法定義舉例:P ::= a ?    C#用法:P = a.Opt    0..1次匹配

P為Parser類型,是解析器的抽象基類,它定義了一個抽象的Parse方法:

  1. bool Parse(Scanner scanner); 

Scanner類主要存儲一個字符串輸入,及一個光標位置,光標隨著解析的進行向前移動。

例子:一個整數解析器, 定義為一個可選的符號后面跟若干數字:

  1. Parser signed = (Parser.Lit('+') | '-').Opt;  
  2. Parser p = (signed + Parser.DigitChar.Plus).Lexeme;  
  3. bool success = p.Parse(new Scanner("-123")); 

其中,Lit表示常量,Lexeme表示為詞法分析,即不忽略空格。

二)C# Parsing Library:ParserRef

一個常用的四則運算表達式文法:

  1. group      ::= '(' expression ')' 
  2. factor     ::= integer | group  
  3. term       ::= factor (('*' factor) | ('/' factor))*  
  4. expression ::= term (('+' term) | ('-' term))* 

用下面的方法是錯誤的:

  1. Parser group; //  Parser 是抽象類,無法 new  
  2. Parser factor;  
  3. factor = Parser.Int | group; // 錯誤! group沒有初始化!  

但是使用ParserRef 就可以了:

  1. ParserRef group = new ParserRef();  
  2. ParserRef factor = new ParserRef();  
  3. factor.Parser = Parser.Int | group;  

完整的定義如下:

  1. ParserRef group = new ParserRef();  
  2. ParserRef factor = new ParserRef();  
  3. ParserRef term = new ParserRef();  
  4. ParserRef expression = new ParserRef();  
  5.  
  6.  
  7. group.Parser = '(' + expression + ')';  
  8.  
  9. factor.Parser = Parser.Int  
  10.               | group;  
  11.  
  12. term.Parser     = factor +   
  13.                   ( ('*' + factor)  
  14.                   | ('/' + factor)  
  15.                   ).Star;  
  16.  
  17. expression.Parser = term +   
  18.                     ( ('+' + term)  
  19.                     | ('-' + term)  
  20.                     ).Star; 

三)C# Parsing Library:Rule和語義支持

和 spirit一樣,通過對[]的重載,實現對語義的支持。一般的parser的Action類型為Action< string>, 即 void Action(string s)。s為該parser匹配的內容。如果要支持上下文, 就要使用Rule了. Rule帶有一個模板參數T,表示屬性類型。Action類型為Func< T,T,T> 即 T Action(T lhs, T rhs)。對于以下的簡單規則:       

  1. LeftRule := RightRule [ Action(lhs, rhs) ] 

其語義為:LeftRule.Attribute = Action(LeftRule.Attribute, RightRule.Attribute).

上面的四則運算示例可修改如下:

  1. Grammar< int> grammar  = new Grammar< int>();  
  2. Rule< int> group = new Rule< int>(grammar);  
  3. Rule< int> factor = new Rule< int>(grammar);  
  4. Rule< int> term = new Rule< int>(grammar);  
  5. Rule< int> expression  = new Rule< int>(grammar);  
  6. Rule< int> start = new Rule< int>(grammar);  
  7. grammar.Start = start;  
  8.  
  9. group.Parser = '(' + expression [ (lhs, rhs) => rhs ] + ')';  
  10.  
  11. factor.Parser = Parser.IntValue [ v => grammar.Ret(v) ]  // (#1)  
  12.               | group [ (lhs, rhs) => rhs ];  
  13.  
  14. term.Parser = factor [ (lhs, rhs) => rhs ] +   
  15.               ( ('*' + factor [ (lhs, rhs) => lhs * rhs ])  
  16.               | ('/' + factor [ (lhs, rhs) => lhs / rhs ])  
  17.               ).Star;  
  18.  
  19. expression.Parser = term [ (lhs, rhs) => rhs ] +   
  20.                     ( ('+' + term [ (lhs, rhs) => lhs + rhs ])  
  21.                     | ('-' + term [ (lhs, rhs) => lhs - rhs ])  
  22.                     ).Star;  
  23.  
  24.  
  25. start.Parser = expression [ (lhs, rhs) => rhs ] + Parser.End;  
  26.  
  27.  
  28. int result;  
  29. bool success = grammar.Parse("10 + 20 + 30 * (40 + 50)"out result);  
  30. if (success) Console.WriteLine(result); 

說明:

對于一般的Parser,語義動作中并不能有返回值,因為它不知道屬性的確切類型,要支持屬性,必須使用 Grammar.Ret().

在我自己實現以前,大致搜了一下,在CodeProject上有一個類似的實現,也是模仿Boost.Spirit,不過它的語義處理采用C#的事件機制,用起來極不方便。這個項目我剛剛把它發布在google code 上面,項目主頁:http://code.google.com/p/csparsing/。當然它還遠遠不夠成熟。

【編輯推薦】

  1. 簡單易懂的C#.NET多線程應用
  2. C#注冊表是如何操作的
  3. C#擴展方法:對擴展進行分組管理
  4. Visual C# 3.0新特性的總結
  5. 網站安全性:C#防SQL注入代碼的實現方法

 

責任編輯:book05 來源: cnblogs
相關推薦

2009-08-12 18:35:36

C# ArrayLis

2009-08-25 10:24:29

C# delegate

2009-08-10 16:30:56

C# BitmapDa

2009-08-17 16:47:51

C# Anonymou

2009-08-12 09:41:28

C# Director

2009-09-03 15:57:11

C# SystemMe

2009-08-12 15:43:02

操作C# Datase

2009-07-31 14:15:38

C# 構造函數

2009-08-04 08:48:44

C#內置特性

2009-08-12 15:34:40

C# DBNull

2009-08-18 16:45:40

C# Raw Sock

2009-08-07 16:10:20

C#調用API

2009-08-13 17:36:54

編譯C#代碼

2009-08-26 17:31:59

C# const常量

2009-09-03 09:40:57

C#創建表單

2009-08-21 15:16:23

C#使用指針

2009-08-06 18:15:13

C# SQL Serv

2009-09-01 16:19:57

C# new()約束

2009-08-20 16:25:59

C# 匿名方法

2009-08-03 18:49:17

C#和Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久亚洲精品 | 久久99精品久久久 | 国产99久久精品一区二区永久免费 | 亚洲欧洲日韩精品 中文字幕 | 国产精品久久久久久久7电影 | 亚洲一区二区三区四区五区午夜 | 久草精品视频 | 欧美激情一区二区 | 91在线视频在线观看 | 国产午夜精品视频 | 国产激情免费视频 | 91在线视频播放 | 99精品视频一区二区三区 | 欧美日韩国产一区二区三区 | 久久精品国产一区二区三区不卡 | 国产欧美在线 | 在线视频成人 | 久久免费大片 | 国产精品日本一区二区在线播放 | 91精品国产综合久久久亚洲 | 91污在线| 欧美综合在线观看 | 青草青草久热精品视频在线观看 | 亚洲国产91 | 午夜影院普通用户体验区 | 国产精品国产精品国产专区不片 | 99只有精品| 一区二区三区四区电影 | 欧美激情精品久久久久久免费 | 成人欧美一区二区三区黑人孕妇 | 久久夜色精品国产 | 国产免费拔擦拔擦8x高清 | 青青草精品 | 男人亚洲天堂 | 一区二区三区视频在线观看 | 久久国产精品一区 | 高清人人天天夜夜曰狠狠狠狠 | 国产中文 | 天天爽天天操 | 香蕉久久久久久 | 亚洲精品国产第一综合99久久 |