# Using the language server for a language

In order to highlight a language, the language server expects that the reader for the language returns a `FileReader` for the given file when the `readFile` function is called. This happens automatically if the `FilePkgReader` class is used to read the language. The language server then calls the `createParser` function of the `FileReader` to create a parser containing the syntax of the language. If it is enough to call the constructor of the parser, it is possible to override the `rootRule` function to only specify the root rule to use while parsing.

Reading a simple language can be implemented as follows:

    use lang:bs:macro; // for named{}

    PkgReader reader(Url[] files, Package pkg) on Compiler {
        FilePkgReader(files, pkg, &createFile(FileInfo));
    }

    FileReader createFile(FileInfo info) on Compiler {
        FooFile(info);
    }

    class FooFile extends FileReader {
        init(FileInfo info) {
            init(info) {}
        }

        void readSyntaxRules() {}
        void readSyntaxProductions() {}
        void readTypes() {}
        void resolveTypes() {}
        void readFunctions() {}
        void resolveFunctions() {}

        // Either override this function...
        Rule rootRule() {
            named{SFile};
        }

        // ...or this function.
        InfoParser createParser() {
            InfoParser parser(named{SFile});
            // Add any additional syntax here.
            parser;
        }
    }