2010-03-04 3 views
2

Мне нужно создать простой синтаксический анализатор для типа ввода, выраженного в виде текста.Java или Scala для FSM Parser?

я реализовал FSM в Java с использованием двух ИНТ массивов:

states[][] 
actions[][] 

Как я ее отладки я понял, что это может быть проще в использовании Java перечислений в качестве переменной из этих типов должны отображаться как значение в представлении отладки в IntelliJ. Однако, когда я начал этот путь, казалось, что единственный способ использовать Enums - разместить таблицы состояний и действий в HashMap - или есть способ сделать многомерный массив, где размеры - значения Enum? Я бы предпочел не брать создание объекта и удар производительности, связанный с HashMap, если я могу ему помочь.

Я тогда думал, что могу взглянуть на Скала, чтобы посмотреть, может ли это быть лучшим вариантом.

Итак, вопрос в том, будет ли Scala лучшим языком для выражения плотного FSM, или мне лучше не придерживаться Java-массивов?

+4

http://ru.wikipedia.org/wiki/Flying_Spaghetti_Monster <3 –

+1

@Bears съест вас:? – SyntaxT3rr0r

+0

@ Randy Kahle: как для Scala vs Java: Scala может быть более мощным, чтобы выразить ваш FSM, но Java может использоваться более «низкоуровневым» способом, чем Scala, поскольку Java действительно представляет собой OO-гибрид, а не полный язык OO , Scala не позволяет напрямую обращаться к примитивам или примитивным массивам. Вы * можете * получить очень хорошие перфомансы в Scala, но вам действительно нужно знать, что вы делаете, и как/когда ваш код Scala закончится с использованием (очень быстрых) базовых Java-примитивных массивов. Итак, ИМХО за то, что вы хотите делать с Java. – SyntaxT3rr0r

ответ

1

Многомерные перечислимые массивы в порядке.

Не следующий работает для вас (может быть, я неправильно понял ваш вопрос):

public class SO { 

    public static void main(String[] args) { 
     States[][] array = new States[0][]; 
    } 

    private enum States { 
     a, 
     b 
    }  
} 

Если у вас есть большой FSM или их много (как вы можете иметь в играх) и правильно хочет чтобы уклониться от ненужного создания объекта (и ненужного GC, который действительно может убить вашу игру), тогда, безусловно, можно использовать Java перечисления, чтобы получить некоторую безопасность и, тем не менее, иметь эффективный код.

Другое дело, что оператор «case» на перечислениях в Java, если я не ошибаюсь по умолчанию (быстрый) переключатель таблицы (вместо хроматического переключателя поиска).

2

Я сердечно рекомендую вам взглянуть на Scala - это отличный язык, и его стоит оценивать. Но проблема, о которой вы описали, не одна, хорошая причина для выбора нового языка. Если вы изучите Scala, очень вероятно, что реализация вашего парсера FSM будет проще, чем на Java, но обучение Scala и внедрение простого парсера FSM, вероятно, не проще, чем просто делать это на Java.

Кроме того, не совсем понятно, что вы хотите подробно: хотите ли вы индексировать массивы с помощью значения Enum? Вы можете придумать. Вы хотите, чтобы массивы содержали Enums? Это должно сработать. Вы хотите интерпретировать внутренний массив как Enum? Напишите функцию-оболочку, которая создает объект, который дает вам представление, похожее на то, что вы хотите.

+1

Rex - спасибо. Некоторое время я изучаю Скала; переход на Scala был бы моим первым серьезным использованием языка. Это не критически важная задача, поэтому я могу потратить время, чтобы исследовать прочную реализацию и учиться в одно и то же время. Моя цель состоит в том, чтобы в итоге реализовать очень четкую и краткую реализацию, но все же так же быстро, как и мой обычный подход в Java, с помощью int [] []. В частности, мне очень просто. У меня есть три перечисления - состояния, действия и токены. Мне нужно нанести на карту: (состояние, токен) -> состояние (состояние, токен) -> действие , а затем иметь оператор case для типа действия. –

+0

@ Randy: Я до сих пор не понимаю, что вам нужно. Как вы знаете, учитывая «состояние (состояние, токен)», какое «действие» вы хотите отобразить? В чем разница между парами '(state, token)' и представлением 'state (state, token)' state? –

1

Мне кажется, что ваша главная забота - это производительность. Хотя есть много причин, можно сделать это в Scala, делая его быстрее не является одним из них. Это будет так же быстро, как Java, если вы позаботитесь о том, чтобы избежать абстракций более высокого уровня, но не быстрее.

+0

Я в основном согласен, за исключением того, что можно лучше скрыть низкоуровневый высокопроизводительный код с помощью Scala, чем с Java - несколько имплицитов и операторов в ключевых местах создают мир различий. –

+0

Даниил - спасибо. Я ищу реализацию, которая будет краткой, ясной и быстрой, как настроенная реализация на Java. –

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