Parse some code.

pull/15/head
Jussi Pakkanen 11 years ago
parent e7ca0ab09b
commit 7d25129c03
  1. 62
      tools/cmake2meson.py

@ -14,6 +14,66 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import sys, os
import re
class Lexer:
def __init__(self):
self.token_specification = [
# Need to be sorted longest to shortest.
('ignore', re.compile(r'[ \t]')),
('id', re.compile('[_0-9a-z/A-Z.]+')),
('eol', re.compile(r'\n')),
('comment', re.compile(r'\#.*')),
('lparen', re.compile(r'\(')),
('rparen', re.compile(r'\)')),
('string', re.compile('"[^"]*?"')),
]
def lex(self, code):
lineno = 1
line_start = 0
loc = 0;
col = 0
while(loc < len(code)):
matched = False
value = None
for (tid, reg) in self.token_specification:
mo = reg.match(code, loc)
if mo:
curline = lineno
col = mo.start()-line_start
matched = True
loc = mo.end()
match_text = mo.group()
if tid == 'ignore' or tid == 'comment':
pass
elif tid == 'lparen':
yield('lparen')
elif tid == 'rparen':
yield('rparen')
elif tid == 'string':
yield('String: ' + match_text[1:-1])
elif tid == 'id':
yield('Id: ' + match_text)
elif tid == 'eol':
yield('eol')
else:
raise RuntimeError('Wharrgarbl')
break
if not matched:
raise RuntimeError('Lexer got confused %d %d' % (lineno, col))
def convert(cmake_root):
cfile = os.path.join(cmake_root, 'CMakeLists.txt')
cmakecode = open(cfile).read()
l = Lexer()
for t in l.lex(cmakecode):
print(t)
if __name__ == '__main__':
pass
if len(sys.argv) != 2:
print(sys.argv[0], '<CMake project root>')
convert(sys.argv[1])

Loading…
Cancel
Save