felix-lang / felix

The Felix Programming Language
Other
804 stars 43 forks source link

Syntax highlighting for Felix #188

Closed ghost closed 10 months ago

ghost commented 10 months ago

Which text editors have syntax highlighting support for Felix? Does Felix have a recommended IDE?

skaller commented 10 months ago

I support vim. Others have done howl and emacs. You can try C++ at a pinch. If you know how to write highlights for your editor I can get you a starting list of "keywords". The main "IDE" is flx and perhaps your shell. flx autobuilds so there's no need for any IDE tooling for that. The other useful tool is flx_web which is a webserver (part of the build) which can show .flx and .fdoc (and C/C++) files with hyperlinking (but no editing support).

You really don't need an IDE with Felix. Other languages require a lot of boilerplate. Felix is very high level and most things can be expressed succinctly. My main searching tool is actually grep.

I would like a VScode plugin, but I haven't been able to find a quick way to make one (i.e. that doesn't take months learning what you need to know to get it to work).

skaller commented 10 months ago

Just FYI: Felix has a novel thing called DSSLs, Domain Specific Sub-Languages. In a DSSL, you can design your own language, and just add it to Felix. For example in Felix you can write:

regdef ident = letter  (letter | digit)*;

and the grammar for and semantics of that syntax is part of the regular definition DSSL. That syntax is NOT in the base Felix language. It is is the LIBRARY. Other language allow you to overload operators. Felix allows you add your own grammar (as long as it doesn't conflict with the base language: you can design a domain specific SUB language which is an extension of Felix).

In fact, there is a small WHITE LIE above. There IS NO FELIX LANGUAGE. The WHOLE language is a defined in user space in the standard library. The ONLY hard coded syntax is the syntax of the grammar used to specify the syntax of grammars (i.e. as a bootstrap).

Now why bring this up? How the heck could any of the lame IDE around possibly cope with a self-extending language? Felix is orders of magnitude too powerful for them. At best you can program an IDE to support a commonly used grammar (the standard grammar). It would be really cool if IDE's could be self-extending, but most require hard coded plugins.

I'd really like VScode support. I think it's a pretty good system compared to the crap I use: vim. But I've been using vi family editors for 50 years... I surely don't recommend it to a newcomer. And I haven't been able to find a "VScode plugin for dummies" example I can just plugin and edit a bit of.

ghost commented 10 months ago

I support vim. Others have done howl and emacs. You can try C++ at a pinch. If you know how to write highlights for your editor I can get you a starting list of "keywords".

Please give me the list of keywords. Thank you.

skaller commented 10 months ago

You can look at `src/misc/vim/syntax/felix.vim. Extract below. A few are missing, and some are obsolete, but it's what I use and should be reasonable.

Strings roughly follow Python: single and double quotes, and tripled single and double quotes.

Comment as in C++ with // to end of line, and /... / as in C except that Felix allows nested C comments.

The usual identifiers except single quotes are allowed at the end of an identifier like a', and you can have hyphens in a word like a-b (which is an identifier NOT subtraction), and Felix also has TeX symbols \letters for example \gamma.

Note that lexicology is again user defined in the library. The parser is "scannerless" meaning there is NO separate tokeniser. The parser handles tokens itself using regexps.

syn keyword felixError break
syn keyword felixError continue
syn keyword felixError repeat

syn keyword felixStatement end
syn keyword felixStatement catch 
syn keyword felixStatement try
syn keyword felixStatement endtry
syn keyword felixStatement assert
syn keyword felixStatement axiom
syn keyword felixStatement body
syn keyword felixStatement break 
syn keyword felixStatement call
syn keyword felixStatement case
syn keyword felixStatement proj
syn keyword felixStatement aproj
syn keyword felixStatement inj
syn keyword felixStatement ainj
syn keyword felixStatement caseno
syn keyword felixStatement casearg
syn keyword felixStatement cfun
syn keyword felixStatement class
syn keyword felixStatement comment
syn keyword felixStatement continue
syn keyword felixStatement const
syn keyword felixStatement cproc
syn keyword felixStatement cstruct
syn keyword felixStatement ctor
syn keyword felixStatement subtype
syn keyword felixStatement supertype
syn keyword felixStatement ctypes
syn keyword felixStatement def
syn keyword felixStatement do
syn keyword felixStatement done
syn keyword felixStatement begin
syn keyword felixStatement elif
syn keyword felixStatement else
syn keyword felixStatement otherwise
syn keyword felixStatement endcase
syn keyword felixStatement endif
syn keyword felixStatement chainmatch
syn keyword felixStatement ormatch
syn keyword felixStatement endmatch
syn keyword felixStatement enum
syn keyword felixStatement cenum
syn keyword felixStatement cflags
syn keyword felixStatement expect
syn keyword felixStatement extern
syn keyword felixStatement for
syn keyword felixStatement forget
syn keyword felixStatement fork
syn keyword felixStatement functor
syn keyword felixStatement fun
syn keyword felixStatement gen
syn keyword felixStatement goto
syn keyword felixStatement halt
syn keyword felixStatement header
syn keyword felixStatement ident
syn keyword felixStatement include
syn keyword felixStatement incomplete
syn keyword felixStatement inf
syn keyword felixStatement in
syn keyword felixStatement instance
syn keyword felixStatement is
syn keyword felixStatement inherit
syn keyword felixStatement inline
syn keyword felixStatement jump
syn keyword felixStatement lemma
syn keyword felixStatement library
syn keyword felixStatement let
syn keyword felixStatement loop
syn keyword felixStatement lval
syn keyword felixStatement macro
syn keyword felixStatement module
syn keyword felixStatement namespace
syn keyword felixStatement NaN
syn keyword felixStatement new
syn keyword felixStatement box
syn keyword felixStatement unbox
syn keyword felixStatement noinline
syn keyword felixStatement nonterm
syn keyword felixStatement noreturn
syn keyword felixStatement not
syn keyword felixStatement package
syn keyword felixStatement pod
syn keyword felixStatement private
syn keyword felixStatement proc
syn keyword felixStatement property
syn keyword felixStatement routine
syn keyword felixStatement callcc
syn keyword felixStatement reduce
syn keyword felixStatement ref
syn keyword felixStatement rename
syn keyword felixStatement requires
syn keyword felixStatement return
syn keyword felixStatement from
syn keyword felixStatement SCHEME
syn keyword felixStatement syntax
syn keyword felixStatement literal
syn keyword felixStatement spawn_fthread
syn keyword felixStatement schedule_fthread 
syn keyword felixStatement spawn_process 
syn keyword felixStatement spawn_pthread
syn keyword felixStatement static
syn keyword felixStatement struct
syn keyword felixStatement then
syn keyword felixStatement todo
syn keyword felixStatement to
syn keyword felixStatement typedef
syn keyword felixStatement typeset
syn keyword felixStatement typefun
syn keyword felixStatement type
syn keyword felixStatement union
syn keyword felixStatement variant
syn keyword felixStatement use
syn keyword felixStatement val
syn keyword felixStatement var
syn keyword felixStatement once
syn keyword felixStatement virtual
syn keyword felixStatement where
syn keyword felixStatement when
syn keyword felixStatement with
syn keyword felixStatement yield
syn keyword felixStatement uncopyable
syn keyword felixStatement _gc_pointer
syn keyword felixStatement _gc_type
syn keyword felixStatement _svc
syn keyword felixStatement _deref
syn keyword felixStatement and
syn keyword felixStatement implies 
syn keyword felixStatement as
syn keyword felixStatement callback
syn keyword felixStatement code
syn keyword felixStatement false
syn keyword felixStatement if
syn keyword felixStatement isin
syn keyword felixStatement match
syn keyword felixStatement noexpand
syn keyword felixStatement of
syn keyword felixStatement or
syn keyword felixStatement the
syn keyword felixStatement true
syn keyword felixStatement typematch
syn keyword felixStatement typecase
syn keyword felixStatement chip
syn keyword felixStatement device
syn keyword felixStatement connect
syn keyword felixStatement connector
syn keyword felixStatement circuit
syn keyword felixStatement endcircuit
syn keyword felixStatement wire
syn keyword felixStatement _
" all the felix keywords ..
" directives
syn keyword felixDefine body
syn keyword felixDefine comment
syn keyword felixDefine export
syn keyword felixDefine header
syn keyword felixDefine finaliser encoder decoder scanner
syn keyword felixDefine include inherit inline
syn keyword felixDefine macro
syn keyword felixDefine noinline
syn keyword felixDefine open
syn keyword felixDefine package pod private publish
syn keyword felixDefine reduce rename
syn keyword felixDefine todo
syn keyword felixDefine use

" actually this is a statement, but the directive colour seems best..
syn keyword felixDefine inherit
" special identifiers
syn keyword felixDefine this
syn keyword felixDefine root
syn keyword felixDefine self

" statement keywords
syn keyword felixStatement all as attempt
syn keyword felixStatement call case caseno code const class ctypes
syn keyword felixStatement def
syn keyword felixStatement endattempt except exceptions 
syn keyword felixStatement finally fork functor fun cfun
syn keyword felixStatement goto
syn keyword felixStatement interface inf method object extends implements extend
syn keyword felixStatement jump
syn keyword felixStatement lambda loop
syn keyword felixStatement namespace module
syn keyword felixStatement NaN
syn keyword felixStatement obj of
syn keyword felixStatement proc cproc
syn keyword felixStatement raise ref regexp return regdef parse parser
syn keyword felixStatement struct
syn keyword felixStatement to type typedef typeof
syn keyword felixStatement union
syn keyword felixStatement when with
syn keyword felixStatement _
yn keyword felixConditional if
syn keyword felixConditional then
syn keyword felixConditional else
syn keyword felixConditional elif
syn keyword felixConditional endif

syn keyword felixConditional match
syn keyword felixConditional typematch
syn keyword felixConditional regmatch
syn keyword felixConditional endmatch

syn keyword felixConditional typecase
syn keyword felixConditional endcase

" repeating constructs
syn keyword felixRepeat for 
syn keyword felixRepeat do done downto
syn keyword felixRepeat until upto
syn keyword felixRepeat while 
syn keyword felixRepeat next 
syn keyword felixRepeat perform

" standard library types
syn keyword felixType unit
syn keyword felixType void
syn keyword felixType bool
syn keyword felixType any

syn keyword felixType byte
syn keyword felixType address
syn keyword felixType offset

syn keyword felixType tiny
syn keyword felixType short
syn keyword felixType int
syn keyword felixType long
syn keyword felixType vlong

syn keyword felixType utiny
syn keyword felixType ushort
syn keyword felixType uint
syn keyword felixType ulong
syn keyword felixType uvlong

syn keyword felixType int8
syn keyword felixType int16
syn keyword felixType int32
syn keyword felixType int64

syn keyword felixType uint8
syn keyword felixType uint16
syn keyword felixType uint32
syn keyword felixType uint64

syn keyword felixType size
syn keyword felixType ssize
syn keyword felixType intptr
syn keyword felixType uintptr
syn keyword felixType intmax 
syn keyword felixType uintmax 
syn keyword felixType ptrdiff
syn keyword felixType offset

syn keyword felixType float
syn keyword felixType double
syn keyword felixType ldouble

syn keyword felixType char
syn keyword felixType wchar
syn keyword felixType uchar

syn keyword felixType string
syn keyword felixType ustring

syn keyword felixType cont

syn keyword felixType pin

syn keyword felixConstant true false

" standard library types
syn keyword felixType array
syn keyword felixType varray
syn keyword felixType darray
syn keyword felixType sarray
syn keyword felixType bsarray
syn keyword felixType carray
syn keyword felixType list
ghost commented 10 months ago

Geany syntax highlighting for Felix:

https://github.com/tqo50396/felix.geany.syntaxcoloring

skaller commented 10 months ago

You can add to


src/misc/geary/*
skaller commented 10 months ago

On 10 Dec 2023, at 01:33, tqo50396 @.***> wrote:

@skaller What kind of statement is _?

syn keyword felixStatement _

It’s not a statement it’s a pattern without a name that matches anything i.e. a wildcard. It just gets highlighted the same way. Example

match (1,2) with | (1,) => println$ “One in pos 0”; | => println$ “No 1 in pos 0:; endmatch;

— John Skaller @.***

ghost commented 10 months ago

You can add to

src/misc/geary/*

I submitted the PR. I also deleted https://github.com/tqo50396/felix.geany.syntaxcoloring.