除了用 Perl/Python 做簡單的 regular expression 外,最常用到的就是 Lex && Yacc摟...
Lex : Lexical Analyzar
Yacc : Yet Another Compiler Compiler
Lex Yacc 簡易介紹
Lex
Yacc
Lex && Yacc flow
詳細請參考
A COMPACT GUIDE TO LEX & YACC
底下用 open source 的 Project 來完成我們要的Parser.
請先安裝 PLY (Python Lex-Yacc)
input part
int main(){
a=1;
b=3;
c=a+b;
printf("%d\n",c);
return 0;
}
analysis part
import sys
# This is not required if you've installed pycparser into
# your site-packages/ with setup.py
#
sys.path.insert(0, '..')
from pycparser import c_parser, c_ast, parse_file
from pycparser.portability import printme
# A simple visitor for FuncDef nodes that prints the names and
# locations of function definitions.
#
def show_func_defs(filename):
# Note that cpp is used. Provide a path to your own cpp or
# make sure one exists in PATH.
#
ast = parse_file(filename, use_cpp=True)
ast.show()
if __name__ == "__main__":
if len(sys.argv) > 1:
filename = sys.argv[1]
else:
filename = 'c_files/test.c'
show_func_defs(filename)
output part
FileAST:
FuncDef:
Decl: main, [], []
FuncDecl:
TypeDecl: main, []
IdentifierType: ['int']
Compound:
Assignment: =
ID: a
Constant: int, 1
Assignment: =
ID: b
Constant: int, 3
Assignment: =
ID: c
BinaryOp: +
ID: a
ID: b
FuncCall:
ID: printf
ExprList:
Constant: string, "%d\n"
ID: c
Return:
Constant: int, 0
main at ./c_files/test.c:3
Refs:
C Parser (Front End)
Introducing the Boost parser framework
Spirit Parser Framework
Lex and YACC primer/HOWTO
Simple Top-Down Parsing in Python
Parse::Eyapp::datagenerationtut @ Perl
2.2. Parse::Yapp
Lex && Yacc Example
沒有留言:
張貼留言