2012-06-10 3 views
2

Я хочу написать лексический синтаксический анализатор для обычного текста. Таким образом, я должен обнаружить следующие символы:!?Простой лексический парсер

1) Word, 2) Количество 3) точка и другие знаки препинания 4) "..." "" "!!!" и т. д.

Я считаю, что для каждого элемента писать условие «если еще» не является тривиальным. Итак, есть ли генераторы конечных автоматов для C#? Я знаю ANTLR и другие, но пока я попытаюсь научиться работать с этими инструментами, я могу написать свой собственный «ifelse» FSM.

я надеюсь, что нашел что-то вроде:

FiniteStateMachine.AddTokenDefinition(":)","smile"); 
FiniteStateMachine.AddTokenDefinition(".","dot"); 
FiniteStateMachine.ParseText(text); 
+1

Не могли бы вы дать нам несколько образцов текстового потока, который вы планируете, возможно, захотите разобрать. Это поможет решить, в каком направлении вы должны идти. – kingchris

+0

@kingchris обычный текст, как статья на codebetter, мой вопрос, твит ... – Neir0

+0

Я предлагаю использовать регулярные выражения. Что-то вроде «[a-zA-Z \\ -] +» будет забирать слова (a-z и тире), а «[0-9] * (\\. [0-9] +)?" будут получать номера (включая десятичные числа). Точки и т. Д. Похожи друг на друга - «[! \\. \\?] +» - и вы можете просто добавить любую пунктуацию, которая вам нужна, в квадратных скобках (экранирование специальных символов регулярных выражений с помощью \\, которое оценивается как единый \ после C# стирание строки). Сообщите мне, если это кажется интересным; если это так, я верну его к полному ответу. Ознакомьтесь с [Учебное пособие Microsoft по регулярному выражению] (http://msdn.microsoft.com/en-us/library/ms228595%28v=VS.80%29.aspx) – GGulati

ответ

3

Я предлагаю использовать регулярные выражения. Что-то вроде @ "[a-zA-Z -] +" забирает слова (a-z и тире), а @ "[0-9] * (. [0-9] +)?" будут получать номера (включая десятичные числа). Точки и т. Д. Аналогичны - @ "[!. \?] +" - и вы можете просто добавить любую пунктуацию, которая вам нужна, в квадратных скобках (экранирование специальных символов регулярных выражений с помощью a).

Poor man's "lexer" for C# очень близко к тому, что вы ищете, с точки зрения лексира. Я рекомендую регулярные выражения для слов и чисел в Google, или что-то еще, что вам нужно, чтобы выяснить, какие выражения вам нужны.

EDIT

Или увидеть ответ Джастина для конкретных регулярных выражений.

2

Мы должны знать особенности о том, что вы считаете слово или номер. При этом слово «слово» означает «идентификатор стиля C#», а «число» означает «строка с номерами из базы-10, возможно, включая (но не начинающуюся или заканчивающуюся) десятичную точку».

В этих определениях слова были бы что-нибудь соответствие следующее регулярное выражение:

@"\b(?!\d)\w+\b" 

Обратите внимание, что это would also match unicode. Числа будут соответствовать следующим образом:

@"\b\d+(?:\.\d+)?\b" 

Отметим еще раз, что это не распространяется на шестнадцатеричную, восьмеричную или научной нотации, хотя вы могли бы добавить, что в без особых трудностей. Он также не охватывает numeric literal suffixes.

После сопоставления тех, вы, вероятно, уйти с этого пунктуации:

@"[^\w\d\s]+" 

 Смежные вопросы

  • Нет связанных вопросов^_^